using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using DG.Tweening; using Cysharp.Threading.Tasks; // 这个界面是 persistent的界面 public class BattleHUDWin : UIBase { // 组件引用 // private List damageList = new List(); // private List buffList = new List(); 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 damageContentList = new List(); // 生命周期 protected override void InitComponent() { base.InitComponent(); // 初始化组件引用 绑定按钮等UI组件事件 } protected override void OnPreOpen() { base.OnPreOpen(); EventBroadcast.Instance.AddListener(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken); damagePrefabPool = GameObjectPoolManager.Instance.RequestPool(UILoader.LoadPrefab("DamageContent")); // buffIconPrefabPool = GameObjectPoolManager.Instance.RequestPool(); // buffLabelPrefabPool = GameObjectPoolManager.Instance.RequestPool(ResManager.Instance.LoadAsset("UIComp", "BuffContent")); } protected override void OnPreClose() { base.OnPreClose(); EventBroadcast.Instance.RemoveListener(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken); } 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.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); // heroGo 的 parent 作为参考节点 var heroRect = damageInfo.hurtObj.heroRectTrans; if (heroRect == null) return; // 计算 heroGo 在 content 父节点下的 anchoredPosition var contentRect = content.GetComponent(); var contentParentRect = contentRect.parent as RectTransform; // 获取 heroGo 的世界坐标 Vector3 worldTargetPos = heroRect.TransformPoint(heroRect.anchoredPosition); // 转换到 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) { battleField.OnBattlePause -= OnBattlePause; } battleField = _battleField; battleField.OnBattlePause += OnBattlePause; } private void OnBattlePause(bool isPause) { // 游戏暂停 if (isPause) { foreach (var content in damageContentList) { content.Stop(); } } // 游戏恢复 else { foreach (var content in damageContentList) { content.Resume(); } } } }