yyl
9 小时以前 5d3366f2e0f687995eb7ad2107c4379fe7acd4e8
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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;
 
    private BattleField battleField;
 
    private List<DamageContent> damageContentList = new List<DamageContent>();
 
    // 生命周期
    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();
        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(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, () => RemoveDamageContent(content));
        damageContentList.Add(content);
 
        // 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)
    {
 
    }
 
    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();
            }
        }
    }
}