lcy
2026-06-12 e7e206de7ea26e0037d60ff0c3e9943950340a18
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
using System.Collections.Generic;
using UnityEngine;
 
public class GuildAtkDefBatRankWin : UIBase
{
    [SerializeField] ButtonEx serverBtn;
    [SerializeField] List<GuildAtkDefBatPlayerTop3Cell> playerTop3Cells;
    [SerializeField] ScrollerController scroller;
    [SerializeField] GuildAtkDefBatRankCell myRankCell;
    [SerializeField] RectTransform noRect;
 
    GuildAtkDefBatManager manager { get { return GuildAtkDefBatManager.Instance; } }
 
    /// <summary> 排序后的参战成员列表 </summary>
    List<HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem> sortedMembers = new List<HA525_tagSCFamilyAtkDefBatInfo.tagSCFamilyAtkDefBatMem>();
 
    protected override void InitComponent()
    {
        serverBtn.SetListener(() =>
        {
            UIHelper.ShowServersPanel(GuildManager.Instance.crossServerIDList);
        });
    }
 
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        scroller.OnRefreshCell += OnRefreshCell;
        manager.OnUpdateAtkDefBatInfoEvent += OnUpdateAtkDefBatInfoEvent;
        InitDisplay();
    }
 
    protected override void OnPreClose()
    {
        base.OnPreClose();
        manager.OnUpdateAtkDefBatInfoEvent -= OnUpdateAtkDefBatInfoEvent;
        scroller.OnRefreshCell -= OnRefreshCell;
    }
 
    private void OnUpdateAtkDefBatInfoEvent()
    {
        Display();
    }
 
    public void Display()
    {
        serverBtn.SetActive(manager.IsCrossServer());
        RefreshSortedMembers();
        ShowTop3();
        scroller.m_Scorller.RefreshActiveCellViews();
        DisplayMyRank();
        UpdateNoRect();
    }
 
    private void InitDisplay()
    {
        serverBtn.SetActive(manager.IsCrossServer());
        RefreshSortedMembers();
        ShowTop3();
        CreateScroller();
        DisplayMyRank();
        UpdateNoRect();
    }
 
    /// <summary>
    /// 从 Manager 获取排序后的参战成员列表
    /// </summary>
    void RefreshSortedMembers()
    {
        sortedMembers = manager.GetSortedFamilyMembers();
    }
 
    void CreateScroller()
    {
        scroller.Refresh();
        int cnt = sortedMembers.Count;
        for (int i = 3; i < cnt; i++)
        {
            scroller.AddCell(ScrollerDataType.Header, i);
        }
        scroller.Restart();
    }
 
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        int memberIndex = cell.index;
        if (memberIndex < 0 || memberIndex >= sortedMembers.Count)
            return;
 
        var _cell = cell.GetComponent<GuildAtkDefBatRankCell>();
        _cell.Display(sortedMembers[memberIndex], memberIndex + 1);
    }
 
    private void DisplayMyRank()
    {
        uint myPlayerId = PlayerDatas.Instance.PlayerId;
        int myIndex = sortedMembers.FindIndex(m => m.PlayerID == myPlayerId);
 
        if (myIndex >= 0)
        {
            // 找到自己的排名
            myRankCell.Display(sortedMembers[myIndex], myIndex + 1, true);
        }
        else
        {
            // 自己不在列表中(未参战等),显示默认信息
            myRankCell.Display(null, 0, true);
        }
    }
 
    /// <summary>
    /// 当排名列表只有前3名时,显示无更多数据提示
    /// </summary>
    void UpdateNoRect()
    {
        noRect.SetActive(sortedMembers.Count <= 3);
    }
 
    void ShowTop3()
    {
        int top3Count = Mathf.Min(playerTop3Cells.Count, sortedMembers.Count);
        for (int i = 0; i < playerTop3Cells.Count; i++)
        {
            if (i < top3Count)
            {
                playerTop3Cells[i].Display(sortedMembers[i], i + 1);
            }
            else
            {
                playerTop3Cells[i].Display(null, i + 1);
            }
        }
    }
}