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