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); 
 | 
                    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); 
 | 
                    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.heroRectTrans, 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(); 
 | 
        } 
 | 
    } 
 | 
} 
 |