From 89343a7a0909e5244a3b69c4db1294de4536243b Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期一, 15 十二月 2025 18:15:22 +0800
Subject: [PATCH] 262 幻境阁系统-客户端 新增仅适用武将解锁的头像和形象的红点移除规则
---
Main/System/Battle/BattleHUDWin.cs | 337 ++++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 240 insertions(+), 97 deletions(-)
diff --git a/Main/System/Battle/BattleHUDWin.cs b/Main/System/Battle/BattleHUDWin.cs
index ef233a2..bdbbc49 100644
--- a/Main/System/Battle/BattleHUDWin.cs
+++ b/Main/System/Battle/BattleHUDWin.cs
@@ -7,46 +7,111 @@
using System;
using LitJson;
-
// 杩欎釜鐣岄潰鏄� persistent鐨勭晫闈�
public class BattleHUDWin : UIBase
{
- // 缁勪欢寮曠敤
- // private List<HUDContent> damageList = new List<HUDContent>();
-
- // private List<BuffContent> buffList = new List<BuffContent>();
+ 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;
public Transform damageNode;
-
public Transform buffIconNode;
-
public Transform buffLabelNode;
private BattleField battleField;
-
private List<DamageContent> damageContentList = new List<DamageContent>();
- // 鐢熷懡鍛ㄦ湡
protected override void InitComponent()
{
base.InitComponent();
- // 鍒濆鍖栫粍浠跺紩鐢� 缁戝畾鎸夐挳绛塙I缁勪欢浜嬩欢
}
protected override void OnPreOpen()
{
base.OnPreOpen();
+ RegisterEvents();
+ InitializePools();
+ }
+
+ protected override void OnPreClose()
+ {
+ base.OnPreClose();
+ UnregisterEvents();
+ }
+
+ protected override void OnOpen()
+ {
+ base.OnOpen();
+ }
+
+ protected override void OnClose()
+ {
+ base.OnClose();
+ CleanupBattleField();
+ }
+
+ protected override void NextFrameAfterOpen()
+ {
+ base.NextFrameAfterOpen();
+ }
+
+ protected override void CompleteClose()
+ {
+ base.CompleteClose();
+ }
+
+ private void RegisterEvents()
+ {
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"));
- // buffIconPrefabPool = GameObjectPoolManager.Instance.RequestPool();
- // buffLabelPrefabPool = GameObjectPoolManager.Instance.RequestPool(ResManager.Instance.LoadAsset<GameObject>("UIComp", "BuffContent"));
+ }
+
+ 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.GetPool(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)
@@ -54,6 +119,153 @@
ClearContent(guid);
}
+ private void OnDamageTaken(BattleDmgInfo damageInfo)
+ {
+ SetTargetDamage(damageInfo);
+ SetSelfDamage(damageInfo);
+ }
+
+ private void OnSpeedRatioChange(float newSpeedRatio)
+ {
+ foreach (var content in damageContentList)
+ {
+ content.SetRatio(newSpeedRatio, 1f);
+ }
+ }
+
+ private void OnBattlePause(bool isPause)
+ {
+ if (isPause)
+ {
+ PauseAllDamageContent();
+ }
+ else
+ {
+ 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)
@@ -68,98 +280,29 @@
}
}
- protected override void OnPreClose()
+ private void PauseAllDamageContent()
{
- base.OnPreClose();
- EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
- EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
- }
-
- protected override void OnOpen()
- {
- base.OnOpen();
- }
-
- protected override void OnClose()
- {
- base.OnClose();
- battleField.OnBattlePause -= OnBattlePause;
- battleField = null;
- }
-
- protected override void NextFrameAfterOpen()
- {
- base.NextFrameAfterOpen();
- }
-
- protected override void CompleteClose()
- {
- base.CompleteClose();
- }
-
- private void RemoveDamageContent(DamageContent content)
- {
- damageContentList.Remove(content);
- damagePrefabPool.Release(content.gameObject);
- }
-
- private void OnDamageTaken(BattleDmgInfo damageInfo)
- {
- GameObject damageContent = damagePrefabPool.Request();
- DamageContent content = damageContent.GetComponent<DamageContent>();
- damageContent.transform.SetParent(damageNode, false);
- damageContent.transform.localPosition = new Vector3(damageContent.transform.localPosition.x, damageContent.transform.localPosition.y, 0);
- content.SetDamage(damageInfo, () => RemoveDamageContent(content));
- damageContentList.Add(content);
-
- var heroRect = damageInfo.hurtObj.heroRectTrans;
- if (heroRect == null)
- 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);
-
- contentRect.anchoredPosition = anchoredPos;
- }
-
- public void SetBattleField(BattleField _battleField)
- {
- if (battleField != null)
+ foreach (var content in damageContentList)
{
- battleField.OnBattlePause -= OnBattlePause;
+ content.Stop();
}
- ClearContent(string.Empty, true);
- battleField = _battleField;
- battleField.OnBattlePause += OnBattlePause;
}
- private void OnBattlePause(bool isPause)
+ private void ResumeAllDamageContent()
{
- // 娓告垙鏆傚仠
- if (isPause)
+ foreach (var content in damageContentList)
{
- foreach (var content in damageContentList)
- {
- content.Stop();
- }
+ content.Resume();
}
- // 娓告垙鎭㈠
- else
+ }
+
+ private void RunAllDamageContent()
+ {
+ for (int i = damageContentList.Count - 1; i >= 0; i--)
{
- foreach (var content in damageContentList)
+ if (i < damageContentList.Count)
{
- content.Resume();
+ damageContentList[i].Run();
}
}
}
--
Gitblit v1.8.0