From 6696f835cfba7fd451d7a78342bb56cdc6e2e940 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 10 九月 2025 14:23:45 +0800
Subject: [PATCH] 125 【战斗】战斗系统 子弹部分代码

---
 Main/System/Battle/SkillEffect/BulletSkillEffect.cs |  240 ++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 179 insertions(+), 61 deletions(-)

diff --git a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
index 4e0b138..612bc47 100644
--- a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -39,93 +39,134 @@
         else
         {
             //  鍖哄垎鏁e皠璺熻寖鍥存敾鍑�
-
             if (skillConfig.Scattering == 1)
             {
                 //  鏁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);
-                        continue;
-                    }
-
-                    ShotToTarget(target);
-                }
+                ShotEachTargets();
             }
             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) =>
+                switch (skillConfig.TagAim)
                 {
-                    onHit?.Invoke(_hitIndex, tagUseSkillAttack.HurtList.ToList());
-                };
-
-                if (skillConfig.TagCount >= 6)
-                {
-                    ShotToFormation(rectTarget, onHitFormation);
-                }
-                else
-                {
-                    ShotToFormationEx(rectTarget, onHitFormation);
+                    case 0:
+                        AllAreaShoting();
+                        break;
+                    case 1:
+                        OneTargetShoting();
+                        break;
+                    case 2:
+                        FrontRowShoting();
+                        break;
+                    case 3:
+                        BackRowShoting();
+                        break;
+                    case 4:
+                        VerticalRowShoting();
+                        break;
+                    case 5:
+                        SelfShoting();
+                        break;
                 }
             }
         }
     }
 
-    private void ShotToFormationEx(RectTransform target, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
+    // 0   鍏ㄩ儴鑼冨洿锛�
+    private void AllAreaShoting()
     {
-        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 (skillConfig.TagCount == 0 || skillConfig.TagCount >= 6)
         {
-            // 鍑讳腑灏遍攢姣佸瓙寮�
-            caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
-            // 鎾斁瀛愬脊鐖嗙偢鐗规晥
-
+            // 鑻agCount鐩爣涓暟涓�0鎴�6锛屾牴鎹甌agFriendly鏁屾垜閰嶇疆锛屼唬琛ㄤ綔鐢ㄤ簬鏁屾柟鍏ㄤ綋鎴栨垜鏂瑰叏浣擄紝姝ゆ椂涓荤洰鏍囦负鏁屾垜绔欎綅涓殑2鍙蜂綅缃�
             BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+            ShotToIndex(battleCamp, 1);
+        }
+        else
+        {
+            // 鑻agCount鐩爣涓暟涓�1~5涓紝浠h〃闅忔満浣滅敤浜庢晫鏂规垨鎴戞柟x涓灏嗭紝姝ゆ椂鎵�鏈夎闅忔満鍒扮殑瀵硅薄閮戒负涓荤洰鏍囷紙鏂芥硶浣嶇疆浼氱敤瀹㈡埛绔厤缃級
+            ShotEachTargets();
+        }   
+    }
 
-            foreach (var hurt in hitList)
+    // 1    瀵逛綅锛�
+    private void OneTargetShoting()
+    {
+        // 榛樿鍙��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);
+    }
+
+    // 2    鍓嶆帓锛�
+    private void FrontRowShoting()
+    {
+        // 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.TagAffect != 3 && skillConfig.TagCount < 3)
+        {
+            ShotEachTargets();
+        }
+        else
+        {
+            int targetIndex = int.MaxValue;
+            int minimumIndex = int.MaxValue;
+
+            foreach (var hurt in tagUseSkillAttack.HurtList)
             {
-                BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
-                if (targetObj == null)
+                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;
                 }
 
-                PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
-                PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.heroGo.transform, targetObj.Camp);
-                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, targetObj.Camp);
+                minimumIndex = Mathf.Min(target.teamHero.positionNum, minimumIndex);
+
+                if (target.Camp == battleCamp && target.teamHero.positionNum < 3)
+                {
+                    targetIndex = 1;
+                    break;
+                }
             }
 
-            // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
-            _onHit?.Invoke(index, hitList);
-            isFinish = true;
-        });
+            if (targetIndex == int.MaxValue)
+            {
+                targetIndex = (minimumIndex >= 3) ? 4 : 1;
+            }
+            else
+            {
+                targetIndex = 1;
+            }
 
-        bulletCurves.Add(bulletCurve);
+            ShotToIndex(battleCamp, targetIndex);
+        }
+
     }
 
-    protected void ShotToFormation(RectTransform target, Action<int, List<HB427_tagSCUseSkill.tagSCUseSkillHurt>> _onHit)
+    private void ShotToIndex(BattleCamp camp, int targetIndex)
     {
+        RectTransform targetTransform = caster.battleField.GetTeamNode(camp, targetIndex);
         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) =>
+        var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, targetTransform, tagUseSkillAttack, (index, hitList) =>
         {
             if (isFinish)
                 return;
@@ -135,8 +176,8 @@
 
             BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
             //  棣栧厛鏄洰鏍囪韩涓婄垎鐐�
-            PlayExplosionEffect(skillConfig.ExplosionEffectId, target, battleCamp);
-            PlayExplosionEffect(skillConfig.ExplosionEffect2, target, battleCamp);
+            PlayExplosionEffect(skillConfig.ExplosionEffectId, targetTransform, battleCamp);
+            PlayExplosionEffect(skillConfig.ExplosionEffect2, targetTransform, battleCamp);
 
             foreach (var hurt in hitList)
             {
@@ -147,23 +188,86 @@
                     continue;
                 }
 
-                PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
+                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, targetObj.Camp);
             }
 
             // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
-            _onHit?.Invoke(index, hitList);
+            onHit?.Invoke(index, hitList);
 
             isFinish = true;
         });
 
         bulletCurves.Add(bulletCurve);
+    }
 
+    // 3    鍚庢帓锛�
+    private void BackRowShoting()
+    {
+        // 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.TagAffect != 3 && skillConfig.TagCount < 3)
+        {
+            ShotEachTargets();
+        }
+        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.teamHero.positionNum > 3)
+                {
+                    targetIndex = 4;
+                    break;
+                }
+
+                maxinumIndex = Mathf.Max(target.teamHero.positionNum, maxinumIndex);
+            }
+
+            if (targetIndex == int.MaxValue)
+            {
+                targetIndex = (maxinumIndex < 3) ? 1 : 4;
+            }
+            else
+            {
+                targetIndex = 4;
+            }
+
+            ShotToIndex(battleCamp, targetIndex);
+        }
+    }
+
+    // 4    绾垫帓锛�
+    private void VerticalRowShoting()
+    {
+        // 绾垫帓鍒嗗埆涓�1銆�4锛�2銆�5锛�3銆�6锛屼笁缁勭旱鎺掞紝鎸夊浣嶈鍒欓�夋嫨锛岄粯璁�1鍙枫��2鍙锋垨3鍙蜂负涓荤洰鏍囷紝鍓嶆帓1銆�2銆�3鍙蜂綅缃叏閮ㄦ瀹屽悗锛�4鍙枫��5鍙锋垨6鍙蜂负涓荤洰鏍�
+
+        ShotEachTargets();
+
+    }
+
+    // 5    鑷繁锛�
+    private void SelfShoting()
+    {
+        // 榛樿鍙�夎嚜宸憋紝鑷繁涓轰富鐩爣
+        ShotToIndex(caster.Camp, caster.teamHero.positionNum);
     }
 
     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) =>
         {
@@ -213,6 +317,20 @@
         }
     }
 
+    private void ShotEachTargets()
+    {
+        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);
+        }
+    }
 
 
     public override void Run()

--
Gitblit v1.8.0