From 5f728e2633e8e20ebafc4e534fe7e7362362c839 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 04 十二月 2025 11:58:07 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts
---
Main/System/Battle/BattleHUDWin.cs | 284 +++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 215 insertions(+), 69 deletions(-)
diff --git a/Main/System/Battle/BattleHUDWin.cs b/Main/System/Battle/BattleHUDWin.cs
index 2570383..bdbbc49 100644
--- a/Main/System/Battle/BattleHUDWin.cs
+++ b/Main/System/Battle/BattleHUDWin.cs
@@ -4,56 +4,43 @@
using UnityEngine.UI;
using DG.Tweening;
using Cysharp.Threading.Tasks;
-
+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();
- EventBroadcast.Instance.AddListener<string, BattleObject, List<long>>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
- EventBroadcast.Instance.AddListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_MOUNTED, OnBuffMounted);
- EventBroadcast.Instance.AddListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_DISAPEAR, OnBuffDisapear);
- damagePrefabPool = GameObjectPoolManager.Instance.RequestPool(ResManager.Instance.LoadAsset<GameObject>("UIComp", "DamageContent"));
- // buffIconPrefabPool = GameObjectPoolManager.Instance.RequestPool();
- // buffLabelPrefabPool = GameObjectPoolManager.Instance.RequestPool(ResManager.Instance.LoadAsset<GameObject>("UIComp", "BuffContent"));
+ RegisterEvents();
+ InitializePools();
}
protected override void OnPreClose()
{
base.OnPreClose();
- EventBroadcast.Instance.RemoveListener<string, BattleObject, List<long>>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
- EventBroadcast.Instance.RemoveListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_MOUNTED, OnBuffMounted);
- EventBroadcast.Instance.RemoveListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_DISAPEAR, OnBuffDisapear);
+ UnregisterEvents();
}
protected override void OnOpen()
@@ -64,8 +51,7 @@
protected override void OnClose()
{
base.OnClose();
- battleField.OnBattlePause -= OnBattlePause;
- battleField = null;
+ CleanupBattleField();
}
protected override void NextFrameAfterOpen()
@@ -78,38 +64,172 @@
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 OnDamageTaken(string guid, BattleObject bo, List<long> damageList)
+ private void UnregisterEvents()
{
- 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(damageList, () => RemoveDamageContent(content));
- damageContentList.Add(content);
+ EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
+ EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
+ }
- // heroGo 鐨� parent 浣滀负鍙傝�冭妭鐐�
- var heroGo = bo.heroGo;
- if (heroGo == null)
- return;
+ private void InitializePools()
+ {
+ damagePrefabPool = GameObjectPoolManager.Instance.GetPool(UILoader.LoadPrefab("DamageContent"));
+ }
- var heroRect = heroGo.GetComponent<RectTransform>();
- if (heroRect == null)
- return;
+ public void SetBattleField(BattleField _battleField)
+ {
+ CleanupBattleField();
+ ClearContent(string.Empty, true);
+
+ battleField = _battleField;
+ RegisterBattleFieldEvents();
+ }
- // 璁$畻 heroGo 鍦� content 鐖惰妭鐐逛笅鐨� anchoredPosition
- var contentRect = content.GetComponent<RectTransform>();
- var contentParentRect = contentRect.parent as RectTransform;
+ private void RegisterBattleFieldEvents()
+ {
+ if (battleField == null) return;
+
+ battleField.OnBattlePause += OnBattlePause;
+ battleField.OnBattleRun += OnBattleRun;
+ battleField.OnSpeedRatioChange += OnSpeedRatioChange;
+ }
- // 鑾峰彇 heroGo 鐨勪笘鐣屽潗鏍�
- Vector3 worldTargetPos = heroRect.TransformPoint(heroRect.anchoredPosition);
+ private void UnregisterBattleFieldEvents()
+ {
+ if (battleField == null) return;
+
+ battleField.OnBattlePause -= OnBattlePause;
+ battleField.OnBattleRun -= OnBattleRun;
+ battleField.OnSpeedRatioChange -= OnSpeedRatioChange;
+ }
- // 杞崲鍒� content 鐖惰妭鐐逛笅鐨� anchoredPosition
+ 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 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,
@@ -117,46 +237,72 @@
null,
out anchoredPos);
- contentRect.anchoredPosition = anchoredPos;
+ return anchoredPos;
}
- private void OnBuffMounted(BattleObject bo, SkillConfig buffConfig)
- {
-
- }
-
- private void OnBuffDisapear(BattleObject bo, SkillConfig buffConfig)
- {
-
- }
-
- public void SetBattleField(BattleField _battleField)
+ /// <summary>
+ /// 閰嶇疆DamageContent鐨勯�熷害銆佷激瀹虫暟鎹拰鍥炶皟
+ /// </summary>
+ private void SetupDamageContent(DamageContent content, List<BattleDmg> damageList, BattleDmgInfo damageInfo)
{
if (battleField != null)
{
- battleField.OnBattlePause -= OnBattlePause;
+ content.SetRatio(battleField.speedRatio, 1f);
}
- battleField = _battleField;
- battleField.OnBattlePause += OnBattlePause;
+ content.SetDamage(damageInfo, damageList, () => RemoveDamageContent(content));
+ damageContentList.Add(content);
}
- private void OnBattlePause(bool isPause)
+ /// <summary>
+ /// 绉婚櫎DamageContent瀵硅薄
+ /// </summary>
+ private void RemoveDamageContent(DamageContent content)
{
- // 娓告垙鏆傚仠
- if (isPause)
+ damageContentList.Remove(content);
+ damagePrefabPool.Release(content.gameObject);
+ }
+
+ /// <summary>
+ /// 娓呴櫎鎵�鏈変激瀹虫樉绀哄唴瀹�
+ /// </summary>
+ private void ClearContent(string guid, bool force = false)
+ {
+ if ((battleField != null && battleField.guid == guid) || force)
{
- foreach (var content in damageContentList)
+ for (int i = damageContentList.Count - 1; i >= 0; i--)
{
+ var content = damageContentList[i];
content.Stop();
+ RemoveDamageContent(content);
}
+ damageContentList.Clear();
}
- // 娓告垙鎭㈠
- else
+ }
+
+ private void PauseAllDamageContent()
+ {
+ foreach (var content in damageContentList)
{
- 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)
{
- content.Resume();
+ damageContentList[i].Run();
}
}
}
--
Gitblit v1.8.0