using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using Cysharp.Threading.Tasks;
|
using DG.Tweening;
|
using UnityEngine;
|
|
public class BulletSkillEffect : SkillEffect
|
{
|
// protected SkillConfig skillConfig;
|
// protected BattleObject caster;
|
// protected List<BattleObject> targets; // 目标列表
|
|
protected List<BulletCurve> bulletCurves = new List<BulletCurve>();
|
|
public BulletSkillEffect(SkillConfig _skillConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
|
: base(_skillConfig, _caster, _tagUseSkillAttack)
|
{
|
|
}
|
|
|
public override void OnMiddleFrameStart(int times)
|
{
|
base.OnMiddleFrameStart(times);
|
// 弹射 另外的做法了
|
if (skillConfig.effectType == SkillEffectType.Bullet && skillConfig.BulletPath == 4)
|
{
|
var hurt = tagUseSkillAttack.HurtList[0];
|
BattleObject targetObject = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
if (targetObject == null)
|
{
|
Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
|
return;
|
}
|
ShotToTarget(targetObject);
|
}
|
// 普通的做法 区分打向阵营或者打向个体
|
else
|
{
|
// 区分散射跟范围攻击
|
|
if (skillConfig.Scattering == 1)
|
{
|
// 散射
|
for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
|
{
|
var hurt = tagUseSkillAttack.HurtList[i];
|
BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
if (target == null)
|
{
|
Debug.LogError("特效目标为空 target == null ObjId : " + hurt.ObjID);
|
continue;
|
}
|
|
ShotToTarget(target);
|
}
|
}
|
else
|
{
|
// 范围攻击
|
// 攻击向关键位置 然后所有人受伤
|
int mainTargetIndex = BattleUtility.GetMainTargetPositionNum(caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
|
|
BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
|
|
RectTransform rectTarget = caster.battleField.GetTeamNode(battleCamp, mainTargetIndex);
|
|
Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> onHitFormation = (_hitIndex, _hurtList) =>
|
{
|
onHit?.Invoke(_hitIndex, tagUseSkillAttack.HurtList.ToList());
|
};
|
|
if (skillConfig.TagCount >= 6)
|
{
|
ShotToFormation(rectTarget, onHitFormation);
|
}
|
else
|
{
|
ShotToFormationEx(rectTarget, onHitFormation);
|
}
|
}
|
}
|
}
|
|
private void ShotToFormationEx(RectTransform target, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
|
{
|
BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
|
|
RectTransform effectTrans = effectPlayer.transform as RectTransform;
|
|
var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, (index, hitList) =>
|
{
|
// 击中就销毁子弹
|
caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
|
// 播放子弹爆炸特效
|
|
BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
|
|
foreach (var hurt in hitList)
|
{
|
BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
if (targetObj == null)
|
{
|
Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
|
continue;
|
}
|
|
PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
|
PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.heroGo.transform, targetObj.Camp);
|
PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, targetObj.Camp);
|
}
|
|
// 表现子弹飞行到目标位置
|
_onHit?.Invoke(index, hitList);
|
isFinish = true;
|
});
|
|
bulletCurves.Add(bulletCurve);
|
}
|
|
protected void ShotToFormation(RectTransform target, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
|
{
|
BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
|
|
RectTransform effectTrans = effectPlayer.transform as RectTransform;
|
|
var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, (index, hitList) =>
|
{
|
if (isFinish)
|
return;
|
// 击中就销毁子弹
|
caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
|
// 播放子弹爆炸特效
|
|
BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
|
// 首先是目标身上爆炸
|
PlayExplosionEffect(skillConfig.ExplosionEffectId, target, battleCamp);
|
PlayExplosionEffect(skillConfig.ExplosionEffect2, target, battleCamp);
|
|
foreach (var hurt in hitList)
|
{
|
BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
if (targetObj == null)
|
{
|
Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
|
continue;
|
}
|
|
PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
|
}
|
|
// 表现子弹飞行到目标位置
|
_onHit?.Invoke(index, hitList);
|
|
isFinish = true;
|
});
|
|
bulletCurves.Add(bulletCurve);
|
|
}
|
|
protected void ShotToTarget(BattleObject target)
|
{
|
BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.heroRectTrans, caster.Camp);
|
|
|
var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans, tagUseSkillAttack, (index, hitList) =>
|
{
|
if (isFinish)
|
return;
|
|
|
foreach (var hurt in hitList)
|
{
|
BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
|
if (targetObj == null)
|
{
|
Debug.LogError("目标为空 target == null ObjId : " + hurt.ObjID);
|
continue;
|
}
|
|
PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
|
PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.heroGo.transform, targetObj.Camp);
|
PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, targetObj.Camp);
|
}
|
|
// 表现子弹飞行到目标位置
|
onHit?.Invoke(index, hitList);
|
// 击中就销毁子弹
|
caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
|
|
// 播放子弹爆炸特效
|
isFinish = true;
|
});
|
|
bulletCurves.Add(bulletCurve);
|
}
|
|
protected void PlayExplosionEffect(int effectId, Transform parent, BattleCamp camp)
|
{
|
if (effectId <= 0)
|
return;
|
|
var effect = caster.battleField.battleEffectMgr.PlayEffect(0, effectId, parent, camp);
|
if (effect != null)
|
{
|
effect.transform.localRotation = parent.localRotation;
|
if (effect.transform.localScale.x < 0f)
|
{
|
effect.transform.localRotation *= Quaternion.Euler(0, 180, 0);
|
}
|
}
|
}
|
|
|
|
public override void Run()
|
{
|
foreach (var bulletCurve in bulletCurves)
|
{
|
if (!bulletCurve.IsFinished)
|
bulletCurve.Run();
|
}
|
}
|
|
public override void ForceFinished()
|
{
|
base.ForceFinished();
|
foreach (var bulletCurve in bulletCurves)
|
{
|
bulletCurve.ForceFinish();
|
}
|
}
|
|
public override bool IsFinished()
|
{
|
bool isCurveFinish = false;
|
|
foreach (var bulletCurve in bulletCurves)
|
{
|
isCurveFinish |= bulletCurve.IsFinished;
|
}
|
|
return isCurveFinish && isFinish;
|
}
|
}
|