From 7f9ec6d10ebb5d741b10e2b4168b11ad0ebb22cd Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期二, 11 十一月 2025 17:05:01 +0800
Subject: [PATCH] 125 战斗 飘血 护盾 满怒气 吸血反伤拆分

---
 Main/System/Battle/BattleHUDWin.cs |  360 +++++++++++++++++++++++++++++++++++------------------------
 1 files changed, 213 insertions(+), 147 deletions(-)

diff --git a/Main/System/Battle/BattleHUDWin.cs b/Main/System/Battle/BattleHUDWin.cs
index df219fd..bfbf6fc 100644
--- a/Main/System/Battle/BattleHUDWin.cs
+++ b/Main/System/Battle/BattleHUDWin.cs
@@ -10,6 +10,10 @@
 //  杩欎釜鐣岄潰鏄� persistent鐨勭晫闈�
 public class BattleHUDWin : UIBase
 {
+    private const int CASTER_DAMAGE_HEIGHT_OFFSET = 100; // 鏂芥硶鑰呬激瀹抽珮搴﹂棿闅�
+    private const int CASTER_DAMAGE_FLOAT_HEIGHT = 150;  // 椋樺瓧鍚戜笂绉诲姩楂樺害
+    private const int TARGET_DAMAGE_FLOAT_HEIGHT = 150;  // 鐩爣浼ゅ椋樺瓧鍚戜笂绉诲姩楂樺害
+
     private GameObjectPoolManager.GameObjectPool damagePrefabPool;
     private GameObjectPoolManager.GameObjectPool buffIconPrefabPool;
     private GameObjectPoolManager.GameObjectPool buffLabelPrefabPool;
@@ -29,35 +33,14 @@
     protected override void OnPreOpen()
     {
         base.OnPreOpen();
-        EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
-        EventBroadcast.Instance.AddListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
-        damagePrefabPool = GameObjectPoolManager.Instance.RequestPool(UILoader.LoadPrefab("DamageContent"));
-    }
-
-    private void OnBattleEnd(string guid, JsonData data)
-    {
-        ClearContent(guid);
-    }
-
-    private void ClearContent(string guid, bool force = false)
-    {
-        if ((battleField != null && battleField.guid == guid) || force)
-        {
-            for (int i = damageContentList.Count - 1; i >= 0; i--)
-            {
-                var content = damageContentList[i];
-                content.Stop();
-                RemoveDamageContent(content);
-            }
-            damageContentList.Clear();
-        }
+        RegisterEvents();
+        InitializePools();
     }
 
     protected override void OnPreClose()
     {
         base.OnPreClose();
-        EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
-        EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
+        UnregisterEvents();
     }
 
     protected override void OnOpen()
@@ -68,13 +51,7 @@
     protected override void OnClose()
     {
         base.OnClose();
-        if (battleField != null)
-        {
-            battleField.OnBattlePause -= OnBattlePause;
-            battleField.OnBattleRun -= OnBattleRun;
-            battleField.OnSpeedRatioChange -= OnSpeedRatioChange;
-            battleField = null;
-        }
+        CleanupBattleField();
     }
 
     protected override void NextFrameAfterOpen()
@@ -87,121 +64,65 @@
         base.CompleteClose();
     }
 
-    private void RemoveDamageContent(DamageContent content)
+    private void RegisterEvents()
     {
-        damageContentList.Remove(content);
-        damagePrefabPool.Release(content.gameObject);
+        EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
+        EventBroadcast.Instance.AddListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
+    }
+
+    private void UnregisterEvents()
+    {
+        EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
+        EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
+    }
+
+    private void InitializePools()
+    {
+        damagePrefabPool = GameObjectPoolManager.Instance.RequestPool(UILoader.LoadPrefab("DamageContent"));
+    }
+
+    public void SetBattleField(BattleField _battleField)
+    {
+        CleanupBattleField();
+        ClearContent(string.Empty, true);
+        
+        battleField = _battleField;
+        RegisterBattleFieldEvents();
+    }
+
+    private void RegisterBattleFieldEvents()
+    {
+        if (battleField == null) return;
+        
+        battleField.OnBattlePause += OnBattlePause;
+        battleField.OnBattleRun += OnBattleRun;
+        battleField.OnSpeedRatioChange += OnSpeedRatioChange;
+    }
+
+    private void UnregisterBattleFieldEvents()
+    {
+        if (battleField == null) return;
+        
+        battleField.OnBattlePause -= OnBattlePause;
+        battleField.OnBattleRun -= OnBattleRun;
+        battleField.OnSpeedRatioChange -= OnSpeedRatioChange;
+    }
+
+    private void CleanupBattleField()
+    {
+        UnregisterBattleFieldEvents();
+        battleField = null;
+    }
+
+    private void OnBattleEnd(string guid, JsonData data)
+    {
+        ClearContent(guid);
     }
 
     private void OnDamageTaken(BattleDmgInfo damageInfo)
     {
         SetTargetDamage(damageInfo);
         SetSelfDamage(damageInfo);
-    }
-
-    private void SetSelfDamage(BattleDmgInfo damageInfo)
-    {
-        if (damageInfo.casterDamageList.Count > 0)
-        {
-            GameObject damageContent = damagePrefabPool.Request();
-            DamageContent content = damageContent.GetComponent<DamageContent>();
-            damageContent.transform.SetParent(damageNode, false);
-            
-            var heroRect = damageInfo.casterObj.heroRectTrans;
-            if (heroRect == null)
-            {
-                damagePrefabPool.Release(damageContent);
-                return;
-            }
-
-            var contentRect = content.GetComponent<RectTransform>();
-            var contentParentRect = contentRect.parent as RectTransform;
-
-            // 鑾峰彇 heroRect 鐨勪笘鐣屽潗鏍囷紙閿氱偣涓轰腑蹇冿級
-            Vector3 worldTargetPos = heroRect.transform.TransformPoint(heroRect.rect.center);
-
-            // 杞崲鍒� content 鐖惰妭鐐逛笅鐨� anchoredPosition
-            Vector2 anchoredPos;
-            RectTransformUtility.ScreenPointToLocalPointInRectangle(
-                contentParentRect,
-                RectTransformUtility.WorldToScreenPoint(null, worldTargetPos),
-                null,
-                out anchoredPos);
-
-            // 璁剧疆鍔ㄦ�佷綅缃紙浼氳鐩栭厤缃腑鐨勪綅缃級
-            Vector2 beginPos = anchoredPos;
-            Vector2 endPos = anchoredPos + new Vector2(0, 150);
-            content.SetPosition(beginPos, endPos);
-
-            // 璁剧疆閫熷害姣斾緥
-            if (battleField != null)
-            {
-                content.SetRatio(battleField.speedRatio, 1f);
-            }
-            
-            content.SetDamage(damageInfo, damageInfo.casterDamageList, () => RemoveDamageContent(content));
-            damageContentList.Add(content);
-        }
-    }
-
-    private void SetTargetDamage(BattleDmgInfo damageInfo)
-    {
-        if (damageInfo.targetDamageList.Count > 0)
-        {
-            GameObject damageContent = damagePrefabPool.Request();
-            DamageContent content = damageContent.GetComponent<DamageContent>();
-            damageContent.transform.SetParent(damageNode, false);
-            
-            var heroRect = damageInfo.hurtObj.heroRectTrans;
-            if (heroRect == null)
-            {
-                damagePrefabPool.Release(damageContent);
-                return;
-            }
-
-            var contentRect = content.GetComponent<RectTransform>();
-            var contentParentRect = contentRect.parent as RectTransform;
-
-            // 鑾峰彇 heroRect 鐨勪笘鐣屽潗鏍囷紙閿氱偣涓轰腑蹇冿級
-            Vector3 worldTargetPos = heroRect.transform.TransformPoint(heroRect.rect.center);
-
-            // 杞崲鍒� content 鐖惰妭鐐逛笅鐨� anchoredPosition
-            Vector2 anchoredPos;
-            RectTransformUtility.ScreenPointToLocalPointInRectangle(
-                contentParentRect,
-                RectTransformUtility.WorldToScreenPoint(null, worldTargetPos),
-                null,
-                out anchoredPos);
-
-            // 璁剧疆鍔ㄦ�佷綅缃紙浼氳鐩栭厤缃腑鐨勪綅缃級
-            Vector2 beginPos = anchoredPos;
-            Vector2 endPos = anchoredPos + new Vector2(0, 150);
-            content.SetPosition(beginPos, endPos);
-
-            // 璁剧疆閫熷害姣斾緥
-            if (battleField != null)
-            {
-                content.SetRatio(battleField.speedRatio, 1f);
-            }
-            
-            content.SetDamage(damageInfo, damageInfo.targetDamageList, () => RemoveDamageContent(content));
-            damageContentList.Add(content);
-        }
-    }
-
-    public void SetBattleField(BattleField _battleField)
-    {
-        if (battleField != null)
-        {
-            battleField.OnBattlePause -= OnBattlePause;
-            battleField.OnBattleRun -= OnBattleRun;
-            battleField.OnSpeedRatioChange -= OnSpeedRatioChange;
-        }
-        ClearContent(string.Empty, true);
-        battleField = _battleField;
-        battleField.OnBattlePause += OnBattlePause;
-        battleField.OnBattleRun += OnBattleRun;
-        battleField.OnSpeedRatioChange += OnSpeedRatioChange;
     }
 
     private void OnSpeedRatioChange(float newSpeedRatio)
@@ -216,22 +137,167 @@
     {
         if (isPause)
         {
-            foreach (var content in damageContentList)
-            {
-                content.Stop();
-            }
+            PauseAllDamageContent();
         }
         else
         {
-            foreach (var content in damageContentList)
-            {
-                content.Resume();
-            }
+            ResumeAllDamageContent();
         }
     }
 
     private void OnBattleRun()
     {
+        RunAllDamageContent();
+    }
+
+    /// <summary>
+    /// 璁剧疆鐩爣鍙楀埌鐨勪激瀹虫樉绀�
+    /// </summary>
+    private void SetTargetDamage(BattleDmgInfo damageInfo)
+    {
+        if (damageInfo.targetDamageList.Count == 0) return;
+
+        RectTransform heroRect = damageInfo.hurtObj.heroRectTrans;
+        if (heroRect == null) return;
+
+        DamageContent content = CreateDamageContent();
+        if (content == null) return;
+
+        Vector2 anchoredPos = CalculateWorldToLocalPosition(heroRect, content);
+        SetupTargetDamagePosition(content, anchoredPos);
+        SetupDamageContent(content, damageInfo.targetDamageList, damageInfo);
+    }
+
+    /// <summary>
+    /// 璁剧疆鐩爣浼ゅ鐨勮捣濮嬪拰缁撴潫浣嶇疆
+    /// </summary>
+    private void SetupTargetDamagePosition(DamageContent content, Vector2 anchoredPos)
+    {
+        // 淇濇寔鑻遍泟鐨� X 鍧愭爣锛屽彧鍦� Y 杞村悜涓婇
+        Vector2 beginPos = anchoredPos;
+        Vector2 endPos = anchoredPos + new Vector2(0, TARGET_DAMAGE_FLOAT_HEIGHT);
+        content.SetPosition(beginPos, endPos);
+    }
+
+    /// <summary>
+    /// 璁剧疆鏂芥硶鑰呭彈鍒扮殑浼ゅ鏄剧ず锛堝弽浼ゃ�佸惛琛�绛夛級
+    /// </summary>
+    private void SetSelfDamage(BattleDmgInfo damageInfo)
+    {
+        if (damageInfo.casterDamageList.Count == 0) return;
+
+        RectTransform heroRect = damageInfo.casterObj.heroRectTrans;
+        if (heroRect == null) return;
+
+        // 鍒涘缓鍗曚釜DamageContent鏄剧ず鎵�鏈夋柦娉曡�呬激瀹�
+        DamageContent content = CreateDamageContent();
+        if (content == null) return;
+
+        Vector2 anchoredPos = CalculateWorldToLocalPosition(heroRect, content);
+        SetupCasterDamagePosition(content, anchoredPos);
+        SetupDamageContent(content, damageInfo.casterDamageList, damageInfo);
+    }
+
+    /// <summary>
+    /// 璁剧疆鏂芥硶鑰呬激瀹崇殑璧峰鍜岀粨鏉熶綅缃�
+    /// </summary>
+    private void SetupCasterDamagePosition(DamageContent content, Vector2 anchoredPos)
+    {
+        // 淇濇寔鑻遍泟鐨� X 鍧愭爣锛屽彧鍦� Y 杞村悜涓婇
+        Vector2 beginPos = anchoredPos;
+        Vector2 endPos = anchoredPos + new Vector2(0, CASTER_DAMAGE_FLOAT_HEIGHT);
+        content.SetPosition(beginPos, endPos);
+    }
+
+    /// <summary>
+    /// 鍒涘缓涓�涓狣amageContent瀵硅薄
+    /// </summary>
+    private DamageContent CreateDamageContent()
+    {
+        GameObject damageContentObj = damagePrefabPool.Request();
+        DamageContent content = damageContentObj.GetComponent<DamageContent>();
+        damageContentObj.transform.SetParent(damageNode, false);
+        return content;
+    }
+
+    /// <summary>
+    /// 璁$畻鑻遍泟涓栫晫鍧愭爣鍒版湰鍦板潗鏍囩殑杞崲
+    /// </summary>
+    private Vector2 CalculateWorldToLocalPosition(RectTransform heroRect, DamageContent content)
+    {
+        RectTransform contentRect = content.GetComponent<RectTransform>();
+        RectTransform contentParentRect = contentRect.parent as RectTransform;
+
+        Vector3 worldTargetPos = heroRect.transform.TransformPoint(heroRect.rect.center);
+
+        Vector2 anchoredPos;
+        RectTransformUtility.ScreenPointToLocalPointInRectangle(
+            contentParentRect,
+            RectTransformUtility.WorldToScreenPoint(null, worldTargetPos),
+            null,
+            out anchoredPos);
+
+        return anchoredPos;
+    }
+
+    /// <summary>
+    /// 閰嶇疆DamageContent鐨勯�熷害銆佷激瀹虫暟鎹拰鍥炶皟
+    /// </summary>
+    private void SetupDamageContent(DamageContent content, List<BattleDmg> damageList, BattleDmgInfo damageInfo)
+    {
+        if (battleField != null)
+        {
+            content.SetRatio(battleField.speedRatio, 1f);
+        }
+
+        content.SetDamage(damageInfo, damageList, () => RemoveDamageContent(content));
+        damageContentList.Add(content);
+    }
+
+    /// <summary>
+    /// 绉婚櫎DamageContent瀵硅薄
+    /// </summary>
+    private void RemoveDamageContent(DamageContent content)
+    {
+        damageContentList.Remove(content);
+        damagePrefabPool.Release(content.gameObject);
+    }
+
+    /// <summary>
+    /// 娓呴櫎鎵�鏈変激瀹虫樉绀哄唴瀹�
+    /// </summary>
+    private void ClearContent(string guid, bool force = false)
+    {
+        if ((battleField != null && battleField.guid == guid) || force)
+        {
+            for (int i = damageContentList.Count - 1; i >= 0; i--)
+            {
+                var content = damageContentList[i];
+                content.Stop();
+                RemoveDamageContent(content);
+            }
+            damageContentList.Clear();
+        }
+    }
+
+    private void PauseAllDamageContent()
+    {
+        foreach (var content in damageContentList)
+        {
+            content.Stop();
+        }
+    }
+
+    private void ResumeAllDamageContent()
+    {
+        foreach (var content in damageContentList)
+        {
+            content.Resume();
+        }
+    }
+
+    private void RunAllDamageContent()
+    {
         for (int i = damageContentList.Count - 1; i >= 0; i--)
         {
             if (i < damageContentList.Count)

--
Gitblit v1.8.0