lcy
2025-11-06 09bc892c7283df8757a07b646d5af21ddaa263d1
Main/System/Battle/BattleHUDWin.cs
@@ -7,36 +7,23 @@
using System;
using LitJson;
//  这个界面是 persistent的界面
public class BattleHUDWin : UIBase
{
    // 组件引用
    // private List<HUDContent> damageList = new List<HUDContent>();
    // private List<BuffContent> buffList = new List<BuffContent>();
    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();
        // 初始化组件引用 绑定按钮等UI组件事件
    }
    protected override void OnPreOpen()
@@ -45,8 +32,6 @@
        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 OnBattleEnd(string guid, JsonData data)
@@ -83,8 +68,13 @@
    protected override void OnClose()
    {
        base.OnClose();
        battleField.OnBattlePause -= OnBattlePause;
        battleField = null;
        if (battleField != null)
        {
            battleField.OnBattlePause -= OnBattlePause;
            battleField.OnBattleRun -= OnBattleRun;
            battleField.OnSpeedRatioChange -= OnSpeedRatioChange;
            battleField = null;
        }
    }
    protected override void NextFrameAfterOpen()
@@ -105,32 +95,98 @@
    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);
        SetTargetDamage(damageInfo);
        SetSelfDamage(damageInfo);
    }
        var heroRect = damageInfo.hurtObj.heroRectTrans;
        if (heroRect == null)
            return;
    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;
            var contentRect = content.GetComponent<RectTransform>();
            var contentParentRect = contentRect.parent as RectTransform;
        // 获取 heroRect 的世界坐标(锚点为中心)
        Vector3 worldTargetPos = heroRect.transform.TransformPoint(heroRect.rect.center);
            // 获取 heroRect 的世界坐标(锚点为中心)
            Vector3 worldTargetPos = heroRect.transform.TransformPoint(heroRect.rect.center);
        // 转换到 content 父节点下的 anchoredPosition
        Vector2 anchoredPos;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(
            contentParentRect,
            RectTransformUtility.WorldToScreenPoint(null, worldTargetPos),
            null,
            out anchoredPos);
            // 转换到 content 父节点下的 anchoredPosition
            Vector2 anchoredPos;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(
                contentParentRect,
                RectTransformUtility.WorldToScreenPoint(null, worldTargetPos),
                null,
                out anchoredPos);
        contentRect.anchoredPosition = 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)
@@ -138,15 +194,26 @@
        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)
    {
        foreach (var content in damageContentList)
        {
            content.SetRatio(newSpeedRatio, 1f);
        }
    }
    private void OnBattlePause(bool isPause)
    {
        //  游戏暂停
        if (isPause)
        {
            foreach (var content in damageContentList)
@@ -154,7 +221,6 @@
                content.Stop();
            }
        }
        //  游戏恢复
        else
        {
            foreach (var content in damageContentList)
@@ -163,4 +229,15 @@
            }
        }
    }
    private void OnBattleRun()
    {
        for (int i = damageContentList.Count - 1; i >= 0; i--)
        {
            if (i < damageContentList.Count)
            {
                damageContentList[i].Run();
            }
        }
    }
}