From e2e187e1ec82f4fe2979883318fc59278c05bca3 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期四, 26 二月 2026 19:55:15 +0800
Subject: [PATCH] 492 武将登场-客户端 废弃寻宝设定表PackType字段,适配CheckPackList字段

---
 Main/System/Battle/SkillEffect/BulletSkillEffect.cs |  525 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 475 insertions(+), 50 deletions(-)

diff --git a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
index dd9b9c2..1022169 100644
--- a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -11,91 +11,516 @@
     // protected BattleObject caster;
     // protected List<BattleObject> targets; // 鐩爣鍒楄〃
 
-    public BulletSkillEffect(SkillConfig _skillConfig, BattleObject _caster, H0604_tagUseSkillAttack _tagUseSkillAttack)
-        : base(_skillConfig, _caster, _tagUseSkillAttack)
+    protected List<BulletCurve> bulletCurves = new List<BulletCurve>();
+    
+    // 鏁e皠鎶�鑳藉嚮涓鏁板櫒锛岀敤浜庡垽鏂槸鍚︽墍鏈夌洰鏍囬兘宸插嚮涓�
+    private int scatterHitCount = 0;
+    private int scatterTotalTargets = 0;
+
+
+    public BulletSkillEffect(SkillBase _skillBase, SkillConfig _skillConfig, SkillSkinConfig _skillSkinConfig, BattleObject _caster, HB427_tagSCUseSkill _tagUseSkillAttack)
+        : base(_skillBase, _skillConfig, _skillSkinConfig, _caster, _tagUseSkillAttack)
     {
 
     }
+    
 
 
-
-    public override void Play(Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
+    public override void OnMiddleFrameEnd(int times, int index)
     {
-        // Caster, //鍦ㄦ柦娉曡�呬笂
-        // Target, //鍦ㄧ洰鏍囦笂
-        // AlliesCenter,// 鍦ㄥ弸鏂逛腑蹇�
-        // EnemiesCenter,// 鍦ㄦ晫鏂逛腑蹇�
-
-        Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> onHitFormation = (_hitIndex, _hurtList) =>
+        base.OnMiddleFrameEnd(times, index);
+        //  寮瑰皠 鍙﹀鐨勫仛娉曚簡
+        if (skillSkinConfig.effectType == SkillEffectType.Bullet && skillSkinConfig.BulletPath == 4)
         {
-            _onHit?.Invoke(_hitIndex, tagUseSkillAttack.HurtList.ToList());
-        };
-
-        if (skillConfig.effectAnchor == SkillEffectAnchor.Caster)
-        {
-            // 涓嶅彲鑳藉瓙寮瑰皠鍚戣嚜宸卞惂
-            Debug.LogError("瀛愬脊鎶�鑳界壒鏁堜笉鑳介敋瀹氬湪鏂芥硶鑰呬笂 skillConfig.effectAnchor");
-            _onHit?.Invoke(0, default);
-        }
-        else if (skillConfig.effectAnchor == SkillEffectAnchor.Target)
-        {
-            if (tagUseSkillAttack == null || tagUseSkillAttack.HurtList.Length <= 0)
+            var hurt = tagUseSkillAttack.HurtList[0];
+            BattleObject targetObject = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+            if (targetObject == null)
             {
-                Debug.LogError("瀛愬脊鎶�鑳界壒鏁堟病鏈夌洰鏍� tagUseSkillAttack.HurtList.Length <= 0");
-                _onHit?.Invoke(0, default);
+                Debug.LogError("鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
                 return;
             }
+            ShotToTarget(targetObject, index);
+        }
+        //  鏅�氱殑鍋氭硶 鍖哄垎鎵撳悜闃佃惀鎴栬�呮墦鍚戜釜浣�
+        else
+        {
+            //  鍖哄垎鏁e皠璺熻寖鍥存敾鍑�
+            if (skillConfig.Scattering == 1)
+            {
+                //  鏁e皠
+                ScatterShot(index);
+            }
+            else
+            {
+                switch (skillConfig.TagAim)
+                {
+                    case 0:
+                        AllAreaShoting(index);
+                        break;
+                    case 1:
+                        OneTargetShoting(index);
+                        break;
+                    case 2:
+                        FrontRowShoting(index);
+                        break;
+                    case 3:
+                        BackRowShoting(index);
+                        break;
+                    case 4:
+                        VerticalRowShoting(index);
+                        break;
+                    case 5:
+                        SelfShoting(index);
+                        break;
+                    default:
+                        Debug.LogError("瀛愬脊鐗规晥娌℃湁閰嶇疆姝g‘鐨凾agAim锛屽己鍒剁粨鏉熷瓙寮圭壒鏁� TagAim: " + skillConfig.TagAim);
+                        ForceFinished();
+                        break;
+                }
+            }
+        }
+    }
+
+    // 0   鍏ㄩ儴鑼冨洿锛�
+    private void AllAreaShoting(int index)
+    {
+        if (skillConfig.TagCount == 0 || skillConfig.TagCount >= 6)
+        {
+            // 鑻agCount鐩爣涓暟涓�0鎴�6锛屾牴鎹甌agFriendly鏁屾垜閰嶇疆锛屼唬琛ㄤ綔鐢ㄤ簬鏁屾柟鍏ㄤ綋鎴栨垜鏂瑰叏浣擄紝姝ゆ椂涓荤洰鏍囦负鏁屾垜绔欎綅涓殑2鍙蜂綅缃�
+            BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+            ShotToIndex(battleCamp, 1, index);
+        }
+        else
+        {
+            // 鑻agCount鐩爣涓暟涓�1~5涓紝浠h〃闅忔満浣滅敤浜庢晫鏂规垨鎴戞柟x涓灏嗭紝姝ゆ椂鎵�鏈夎闅忔満鍒扮殑瀵硅薄閮戒负涓荤洰鏍囷紙鏂芥硶浣嶇疆浼氱敤瀹㈡埛绔厤缃級
+            ShotEachTargets(index);
+        }
+    }
+
+    // 1    瀵逛綅锛�
+    private void OneTargetShoting(int index)
+    {
+        // 榛樿鍙��1涓紝瀵逛綅瑙勫垯涓篈1浼樺厛鎵揃1锛孉2浼樺厛鎵揃2锛孉3浼樺厛鎵揃3锛屽浣嶇洰鏍囨浜℃椂锛屼紭鍏堝墠鎺掞紝
+        // 姣斿B2宸茬粡姝讳骸锛岄偅涔圓2灏嗕紭鍏堟墦B1锛屽墠鎺�1銆�2銆�3鍙蜂綅缃叏閮ㄦ浜′箣鍚庢墠寮�濮嬮�夋嫨鍚庢帓4銆�5銆�6鍙蜂綅缃紝
+        // 瀵逛綅鍙彲閫�1涓洰鏍囷紝鍗充富鐩爣
+
+        if (tagUseSkillAttack.HurtList.Length > 1)
+        {
+            Debug.LogError("鏈嶅姟鍣� 瀵逛綅鏀诲嚮鐩爣鏁伴噺閿欒锛屽簲璇ュ彧鏈変竴涓洰鏍� 鎶�鑳絠d" + skillConfig.SkillID);
+        }
+
+        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, index);
+    }
+
+    // 2    鍓嶆帓锛�
+    private void FrontRowShoting(int index)
+    {
+        // 1銆�2銆�3鍙蜂綅涓哄墠鎺掞紝榛樿2鍙蜂綅缃负涓荤洰鏍囷紝褰�1銆�2銆�3鍙蜂綅缃鑹插叏閮ㄦ浜★紝鍓嶆帓灏嗘浛鎹㈡垚鍚庢帓锛�5鍙蜂綅缃彉鏇翠负涓荤洰鏍囷紝
+        // 鑻ラ厤缃甌agAffect缁嗗垎鐩爣锛屼笖浜烘暟灏忎簬3锛屽垯鎵�鏈夎閫夋嫨鐩爣鍧囦负涓荤洰鏍囷紙鏂芥硶浣嶇疆浼氱敤瀹㈡埛绔厤缃級
+        // 锛堝嵆鍓嶆帓榛樿2鍙蜂綅鎴�5鍙蜂綅瑙勫垯鏃犳晥锛屽疄闄呬綔鐢ㄥ灏戜汉灏辨槸澶氬皯涓富鐩爣锛�
+
+        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+
+        if (skillConfig.TagAffect != 0 || skillConfig.TagCount < 3)
+        {
+            ShotEachTargets(index);
+        }
+        else
+        {
+            int targetIndex = int.MaxValue;
+            int minimumIndex = int.MaxValue;
 
             foreach (var hurt in tagUseSkillAttack.HurtList)
             {
                 BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
                 if (target == null)
                 {
-                    Debug.LogError("瀛愬脊鎶�鑳界壒鏁堢洰鏍囦负绌� target == null ObjId : " + hurt.ObjID);
+                    Debug.LogError("鐗规晥鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
                     continue;
                 }
 
-                ShotToTarget(target.heroGo.transform as RectTransform, (index, list) => _onHit(0, new List<H0604_tagUseSkillAttack.tagSkillHurtObj>() { hurt }));
+                minimumIndex = Mathf.Min(target.GetPositionNum(), minimumIndex);
+
+                if (target.Camp == battleCamp && target.GetPositionNum() < 3)
+                {
+                    targetIndex = 1;
+                    break;
+                }
             }
+
+            if (targetIndex == int.MaxValue)
+            {
+                targetIndex = (minimumIndex >= 3) ? 4 : 1;
+            }
+            else
+            {
+                targetIndex = 1;
+            }
+
+            ShotToIndex(battleCamp, targetIndex, index);
         }
-        else if (skillConfig.effectAnchor == SkillEffectAnchor.AlliesCenter)
-        {
-            ShotToTarget(caster.battleField.GetTeamNode(caster.Camp), onHitFormation);
-        }
-        else if (skillConfig.effectAnchor == SkillEffectAnchor.EnemiesCenter)
-        {
-            ShotToTarget(caster.battleField.GetTeamNode(caster.Camp == BattleCamp.Blue ? BattleCamp.Red : BattleCamp.Blue), onHitFormation);
-        }
-        else
-        {
-            Debug.LogError("鏈煡鐨勬妧鑳界壒鏁堥敋鐐圭被鍨�: " + skillConfig.effectAnchor);
-        }
+
     }
 
-    protected void ShotToTarget(RectTransform target, Action<int, List<H0604_tagUseSkillAttack.tagSkillHurtObj>> _onHit)
+    private void ShotToIndex(BattleCamp camp, int targetIndex, int bulletIndex)
     {
-        EffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.EffectId, caster.effectNode);
-
-        effectPlayer.Play();
+        RectTransform targetTransform = caster.battleField.GetTeamNode(camp, targetIndex);
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
 
         RectTransform effectTrans = effectPlayer.transform as RectTransform;
 
-        var tween = BattleUtility.MoveToTarget(effectTrans, target, Vector2.zero, skillConfig.FlyTime, () =>
+        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, skillSkinConfig, effectPlayer, targetTransform, tagUseSkillAttack.HurtList.ToList(), bulletIndex, (index, hitList) =>
         {
-            // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
-            _onHit?.Invoke(0, null);
+            if (isFinish)
+                return;
+            // 鍑讳腑灏遍攢姣佸瓙寮�
+            caster.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BulletEffectId, effectPlayer);
+            // 鎾斁瀛愬脊鐖嗙偢鐗规晥
 
-            //  鍑讳腑灏遍攢姣佸瓙寮�
-            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.EffectId, effectPlayer);
-            //  鎾斁瀛愬脊鐖嗙偢鐗规晥
-            caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.ExplotionEffectId, target).Play();
+            BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+            //  棣栧厛鏄洰鏍囪韩涓婄垎鐐�
+            PlayExplosionEffect(skillSkinConfig.ExplosionEffectId, targetTransform, caster.Camp, 1f);
+            PlayExplosionEffect(skillSkinConfig.ExplosionEffect2, targetTransform, caster.Camp, 1f);
+
+            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(skillSkinConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+            }
+
+            // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
+            onHit?.Invoke(index, hitList);
+
+            isFinish = true;
         });
 
-        caster.battleField.battleTweenMgr.OnPlayTween(tween);
+        bulletCurves.Add(bulletCurve);
     }
+
+    // 3    鍚庢帓锛�
+    private void BackRowShoting(int index)
+    {
+        // 4銆�5銆�6鍙蜂綅涓哄悗鎺掞紝榛樿5鍙蜂綅缃负涓荤洰鏍囷紝褰�4銆�5銆�6鍙蜂綅缃鑹插叏閮ㄦ浜★紝鍚庢帓鎺掑皢鏇挎崲鎴愬墠鎺掞紝2鍙蜂綅缃彉鏇翠负涓荤洰鏍囷紝
+        // 鑻ラ厤缃甌agAffect缁嗗垎鐩爣锛屼笖浜烘暟灏忎簬3锛屽垯鎵�鏈夎閫夋嫨鐩爣鍧囦负涓荤洰鏍囷紙鏂芥硶浣嶇疆浼氱敤瀹㈡埛绔厤缃級
+        // 锛堝嵆鍓嶆帓榛樿2鍙蜂綅鎴�5鍙蜂綅瑙勫垯鏃犳晥锛屽疄闄呬綔鐢ㄥ灏戜汉灏辨槸澶氬皯涓富鐩爣锛�
+
+        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+
+        if (skillConfig.TagAffect != 0 || skillConfig.TagCount < 3)
+        {
+            ShotEachTargets(index);
+        }
+        else
+        {
+            int targetIndex = int.MaxValue;
+            int maxinumIndex = int.MinValue;
+
+            foreach (var hurt in tagUseSkillAttack.HurtList)
+            {
+                BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+                if (target == null)
+                {
+                    Debug.LogError("鐗规晥鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
+                    continue;
+                }
+
+                if (target.Camp == battleCamp && target.GetPositionNum() > 3)
+                {
+                    targetIndex = 4;
+                    break;
+                }
+
+                maxinumIndex = Mathf.Max(target.GetPositionNum(), maxinumIndex);
+            }
+
+            if (targetIndex == int.MaxValue)
+            {
+                targetIndex = (maxinumIndex < 3) ? 1 : 4;
+            }
+            else
+            {
+                targetIndex = 4;
+            }
+
+            ShotToIndex(battleCamp, targetIndex, index);
+        }
+    }
+
+    // 4    绾垫帓锛�
+    private void VerticalRowShoting(int index)
+    {
+        // 绾垫帓鍒嗗埆涓�1銆�4锛�2銆�5锛�3銆�6锛屼笁缁勭旱鎺掞紝鎸夊浣嶈鍒欓�夋嫨锛岄粯璁�1鍙枫��2鍙锋垨3鍙蜂负涓荤洰鏍囷紝鍓嶆帓1銆�2銆�3鍙蜂綅缃叏閮ㄦ瀹屽悗锛�4鍙枫��5鍙锋垨6鍙蜂负涓荤洰鏍�
+        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+        //  鏀诲嚮mininumIndex鐩爣
+        int minimumIndex = int.MaxValue;
+        foreach (var hurt in tagUseSkillAttack.HurtList)
+        {
+            BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+            if (target == null)
+            {
+                Debug.LogError("鐗规晥鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
+                continue;
+            }
+
+            minimumIndex = Mathf.Min(target.GetPositionNum(), minimumIndex);
+        }
+
+        if (minimumIndex != int.MaxValue)
+        {
+            ShotToIndex(battleCamp, minimumIndex, index);
+        }
+        else
+        {
+            Debug.LogError("绾垫帓鏀诲嚮娌℃湁鐩爣 寮哄埗缁撴潫瀛愬脊鐗规晥");
+            ForceFinished();
+        }
+
+
+    }
+
+    // 5    鑷繁锛�
+    private void SelfShoting(int index)
+    {
+        // 榛樿鍙�夎嚜宸憋紝鑷繁涓轰富鐩爣
+        ShotToIndex(caster.Camp, caster.GetPositionNum(), index);
+    }
+
+    //  鏁e皠
+    private void ScatterShot(int index)
+    {
+        // 鍙湪绗竴娆″彂灏勬椂鍒濆鍖栨暎灏勮鏁板櫒
+        if (index == 0)
+        {
+            scatterHitCount = 0;
+            // 鎬诲嚮涓暟 = 鍙戝皠娆℃暟 脳 鐩爣鏁伴噺
+            scatterTotalTargets = skillSkinConfig.ActiveFrames.Length * tagUseSkillAttack.HurtList.Length;
+        }
+        
+        // 澶勭悊鏁e皠閫昏緫
+        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);
+                // 鐩爣涓虹┖鏃跺噺灏戝搴斿彂灏勬鏁扮殑鎬荤洰鏍囨暟
+                if (index == 0) scatterTotalTargets--;
+                continue;
+            }
+            ScatterShot(target, hurt, index, i);
+        }
+    }
+
+    private void ScatterShot(BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, int bulletIndex, int order)
+    {
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
+
+        bool shotToSelf = target.ObjID == caster.ObjID;
+
+        effectPlayer.Alpha = shotToSelf ? 0f : 1f;
+
+        var tempOrder = order;
+
+        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, skillSkinConfig, effectPlayer, target.GetRectTransform(),
+            new List<HB427_tagSCUseSkill.tagSCUseSkillHurt> { hurt }, bulletIndex, (index, hitList) =>
+        {
+            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(skillSkinConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillSkinConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+            }
+
+            // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
+            onHit?.Invoke(index, hitList);
+            // 鍑讳腑灏遍攢姣佸瓙寮�
+            caster.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BulletEffectId, effectPlayer);
+
+            // 澧炲姞鏁e皠鍑讳腑璁℃暟
+            scatterHitCount++;
+            
+            // 鍒ゆ柇鏄惁鎵�鏈夊彂灏勬鏁扮殑鎵�鏈夌洰鏍囬兘宸插嚮涓�
+            if (scatterHitCount >= scatterTotalTargets)
+            {
+                isFinish = true;
+            }
+        });
+
+        bulletCurves.Add(bulletCurve);
+    }
+
+    protected void ShotToTarget(BattleObject target, int bulletIndex)
+    {
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillSkinConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
+
+        bool shotToSelf = target.ObjID == caster.ObjID;
+
+        effectPlayer.Alpha = shotToSelf ? 0f : 1f;
+
+        int bounceHitIndex = 0;
+
+        int tempBulletIndex = bulletIndex;
+
+        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, skillSkinConfig, effectPlayer, target.GetRectTransform(), tagUseSkillAttack.HurtList.ToList(), bulletIndex, (index, hitList) =>
+        {
+            if (skillSkinConfig.BulletPath == 4)
+            {
+                if (bounceHitIndex >= hitList.Count)
+                {
+                    return;
+                }
+                var hurt = hitList[bounceHitIndex++];
+                BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+                if (targetObj != null)
+                {
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                }
+                else
+                {
+                    Debug.LogError("鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
+                }
+
+                // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
+                onHit?.Invoke(index, new List<HB427_tagSCUseSkill.tagSCUseSkillHurt> { hurt });
+
+                if (bounceHitIndex >= tagUseSkillAttack.HurtList.Length)
+                {
+                    caster.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BulletEffectId, effectPlayer);
+                }
+
+                if (isFinish)
+                    return;
+
+                if (tempBulletIndex >= skillSkinConfig.ActiveFrames.Length - 1 && bounceHitIndex >= hitList.Count)
+                {
+                    isFinish = true;
+                }
+            }
+            else
+            {
+                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(skillSkinConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillSkinConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                }
+
+                // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
+                onHit?.Invoke(index, hitList);
+                // 鍑讳腑灏遍攢姣佸瓙寮�
+
+                caster.battleField.battleEffectMgr.RemoveEffect(skillSkinConfig.BulletEffectId, effectPlayer);
+
+                if (isFinish)
+                    return;
+
+                if (bulletIndex >= skillSkinConfig.ActiveFrames.Length - 1)
+                {
+                    isFinish = true;
+                }
+            }
+
+
+        });
+
+        bulletCurves.Add(bulletCurve);
+    }
+
+    
+
+    protected void PlayExplosionEffect(int effectId, Transform parent, BattleCamp camp, float _scaleRatio)
+    {
+        if (effectId <= 0)
+            return;
+
+        var effect = caster.battleField.battleEffectMgr.PlayEffect(caster, effectId, parent, camp, _scaleRatio);
+        if (effect != null)
+        {
+            effect.transform.localRotation = parent.localRotation;
+            if (effect.transform.localScale.x < 0f)
+            {
+                effect.transform.localRotation *= Quaternion.Euler(0, 180, 0);
+            }
+        }
+    }
+
+    private void ShotEachTargets(int index)
+    {
+        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, index);
+        }
+    }
+
 
     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 = bulletCurves.Count <= 0;
+
+        foreach (var bulletCurve in bulletCurves)
+        {
+            isCurveFinish |= bulletCurve.IsFinished;
+        }
+
+        return isCurveFinish && base.IsFinished();
     }
 }
\ No newline at end of file

--
Gitblit v1.8.0