hch
2025-07-02 a277a317c827163c595ec1b21247dc820a1a0ff0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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<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;
 
    // 生命周期
    protected override void InitComponent()
    {
        base.InitComponent();
        // 初始化组件引用 绑定按钮等UI组件事件
    }
 
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        EventBroadcast.Instance.AddListener<BattleObject, List<int>>(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"));
    }
 
    protected override void OnPreClose()
    {
        base.OnPreClose();
        EventBroadcast.Instance.RemoveListener<BattleObject, List<int>>(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);
    }
 
    protected override void OnOpen()
    {
        base.OnOpen();
    }
 
    protected override void OnClose()
    {
        base.OnClose();
    }
 
    protected override void NextFrameAfterOpen()
    {
        base.NextFrameAfterOpen();
    }
 
    protected override void CompleteClose()
    {
        base.CompleteClose();
    }
 
    private void OnDamageTaken(BattleObject bo, List<int> damageList)
    {
        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, () => damagePrefabPool.Release(damageContent));
 
        // heroGo 的 parent 作为参考节点
        var heroGo = bo.heroGo;
        if (heroGo == null)
            return;
 
        var heroRect = heroGo.GetComponent<RectTransform>();
        if (heroRect == null)
            return;
 
        // 计算 heroGo 在 content 父节点下的 anchoredPosition
        var contentRect = content.GetComponent<RectTransform>();
        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;
    }
 
    private void OnBuffMounted(BattleObject bo, SkillConfig buffConfig)
    {
 
    }
 
    private void OnBuffDisapear(BattleObject bo, SkillConfig buffConfig)
    {
 
    }
}