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, H0604_tagUseSkillAttack _tagUseSkillAttack)
|
: base(_skillConfig, _caster, _tagUseSkillAttack)
|
{
|
|
}
|
|
|
|
public override void Play(Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
|
{
|
// 弹射 另外的做法了
|
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, _onHit);
|
}
|
// 普通的做法
|
else
|
{
|
Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHitFormation = (_hitIndex, _hurtList) =>
|
{
|
_onHit?.Invoke(_hitIndex, tagUseSkillAttack.HurtList.ToList());
|
};
|
switch (skillConfig.castMode)
|
{
|
case SkillCastMode.Self:
|
onHitFormation?.Invoke(0, tagUseSkillAttack.HurtList.ToList());
|
Debug.LogError("子弹的目标是自己,暂时不支持 协商程序完成");
|
break;
|
case SkillCastMode.Enemy:
|
var targetNode = caster.battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig.CastIndexNum);
|
ShotToFormation(targetNode, onHitFormation);
|
break;
|
case SkillCastMode.Target:
|
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, _onHit);
|
}
|
break;
|
case SkillCastMode.Allies:
|
var healNode = caster.battleField.GetTeamNode(caster.Camp, skillConfig.CastIndexNum);
|
ShotToFormation(healNode, onHitFormation);
|
break;
|
default:
|
Debug.LogError("暂时不支持其他的方式释放 有需求请联系程序 " + skillConfig.SkillID);
|
break;
|
}
|
}
|
}
|
|
protected void ShotToFormation(RectTransform target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
|
{
|
EffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.effectNode);
|
|
RectTransform effectTrans = effectPlayer.transform as RectTransform;
|
|
var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, (index, hitList) =>
|
{
|
// 表现子弹飞行到目标位置
|
_onHit?.Invoke(index, hitList);
|
|
// 击中就销毁子弹
|
caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
|
// 播放子弹爆炸特效
|
|
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;
|
}
|
|
caster.battleField.battleEffectMgr.PlayEffect(targetObj.ObjID, skillConfig.ExplosionEffectId, targetObj.heroGo.transform);
|
}
|
|
// caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplosionEffectId, target);
|
});
|
|
bulletCurves.Add(bulletCurve);
|
|
}
|
|
protected void ShotToTarget(BattleObject target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
|
{
|
EffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.BulletEffectId, caster.effectNode);
|
RectTransform effectTrans = effectPlayer.transform as RectTransform;
|
|
var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroGo.transform as RectTransform, tagUseSkillAttack, (index, hitList) =>
|
{
|
// 击中就销毁子弹 子弹不需要自动销毁 配置表里autoDestroy为false
|
caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
|
_onHit?.Invoke(index, hitList);
|
});
|
|
bulletCurves.Add(bulletCurve);
|
}
|
|
public override void Run()
|
{
|
foreach (var bulletCurve in bulletCurves)
|
{
|
if (!bulletCurve.IsFinished)
|
bulletCurve.Run();
|
}
|
}
|
}
|