lcy
2026-06-10 47245e8b77a9f064a3cf8f40c12bd1dcd986bce6
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
using UnityEngine;
 
public class GuildAtkDefBatTreasureGrid : MonoBehaviour
{
    [SerializeField] ImageEx bdImage;
    [SerializeField] ButtonEx clickButton;
    [SerializeField] ImageEx topImage;
    [SerializeField] TextEx topNumText;
    [SerializeField] OutlineEx topNumOutline;
    [SerializeField] UIEffectPlayer uiEffectPlayer;
 
    [SerializeField] Color32 topGoldOddColor;
    [SerializeField] Color32 topGoldEvenColor;
    [SerializeField] Color32 topSilverOddColor;
    [SerializeField] Color32 topSilverEvenColor;
 
    [SerializeField] Color32 topGoldOddOutlineColor;
    [SerializeField] Color32 topGoldEvenOutlineColor;
    [SerializeField] Color32 topSilverOddOutlineColor;
    [SerializeField] Color32 topSilverEvenOutlineColor;
 
    [SerializeField] ImageEx qualityImage;
    [SerializeField] TextEx numText;
    [SerializeField] ImageEx itemImage;
    [SerializeField] TextEx itemCntText;
    [SerializeField] TextEx itemNameText;
 
    private int gridIndex;
    private bool isOpened;
    private ushort awardID;
 
    /// <summary>
    /// 初始化格子
    /// </summary>
    /// <param name="index">格子序号 1~n</param>
    /// <param name="isWin">是否胜利</param>
    /// <param name="opened">是否已开启</param>
    /// <param name="awardId">奖励ID(已开启时有效)</param>
    /// <param name="playOpenAnim">是否播放开启动画(翻牌破碎特效)</param>
    public void Init(int index, bool isWin, bool opened, ushort awardId, bool playOpenAnim = false)
    {
        gridIndex = index;
        isOpened = opened;
        awardID = awardId;
 
        // 格子序号
        topNumText.text = index.ToString();
        numText.text = index.ToString();
 
        // topImage按胜负/奇偶设置不同颜色和图片
        bool isOdd = index % 2 == 1;
        string topSpriteKey;
        Color32 numColor;
        Color32 outlineColor;
 
        if (isWin)
        {
            topSpriteKey = isOdd ? "GuildAtkDefBatGridTopGoldOdd" : "GuildAtkDefBatGridTopGoldEven";
            numColor = isOdd ? topGoldOddColor : topGoldEvenColor;
            outlineColor = isOdd ? topGoldOddOutlineColor : topGoldEvenOutlineColor;
        }
        else
        {
            topSpriteKey = isOdd ? "GuildAtkDefBatGridTopSilverOdd" : "GuildAtkDefBatGridTopSilverEven";
            numColor = isOdd ? topSilverOddColor : topSilverEvenColor;
            outlineColor = isOdd ? topSilverOddOutlineColor : topSilverEvenOutlineColor;
        }
        bdImage.SetSprite(isWin ? "GuildAtkDefBatGridGoldBg" : "GuildAtkDefBatGridSilverBg");
        topImage.SetSprite(topSpriteKey);
        topNumText.color = numColor;
        topNumOutline.OutlineColor = outlineColor;
 
        clickButton.SetListener(OnClickGrid);
        uiEffectPlayer.onComplete = null; // 清理回调,防止格子复用时残留
 
        if (playOpenAnim)
            PlayOpenEffect();
        else
            RefreshDisplay();
    }
 
    private void RefreshDisplay()
    {
        topImage.SetActive(!isOpened);
        topNumText.SetActive(!isOpened);
 
        qualityImage.SetActive(isOpened);
        if (isOpened && awardID > 0)
        {
            var config = FamilyAtkDefBatTreasureConfig.Get(awardID);
            if (config != null)
            {
                var itemConfig = ItemConfig.Get(config.ItemID);
                if (itemConfig != null)
                {
                    itemImage.SetItemSprite(config.ItemID);
                    itemCntText.text = config.ItemCount > 1 ? $"x{config.ItemCount}" : string.Empty;
                    itemNameText.text = itemConfig.ItemName;
                }
 
                qualityImage.SetSprite($"GuildAtkDefBatTreasureAwardColor{config.AwardColor}");
            }
        }
    }
 
    private void OnClickGrid()
    {
        if (isOpened)
        {
            if (awardID > 0)
            {
                var config = FamilyAtkDefBatTreasureConfig.Get(awardID);
                if (config != null)
                    ItemTipUtility.Show(config.ItemID);
            }
            return;
        }
 
        var mgr = GuildAtkDefBatManager.Instance;
        if (mgr.GetMyOpenRemainCount() <= 0)
        {
            SysNotifyMgr.Instance.ShowTip("GuildAtkDefBat4");
            return;
        }
 
        mgr.SendOpenTreasure((byte)gridIndex);
    }
 
    /// <summary>
    /// 播放开启动画(隐藏topImage,播放格子破碎特效)
    /// </summary>
    private void PlayOpenEffect()
    {
        topImage.SetActive(false);
        topNumText.SetActive(false);
        uiEffectPlayer.Play();
        RefreshDisplay();
        uiEffectPlayer.onComplete = OnOpenEffectComplete;
    }
 
    private void OnOpenEffectComplete()
    {
        uiEffectPlayer.onComplete = null; // 清除回调,防止重复调用
        GuildAtkDefBatManager.Instance.ShowTreasureAward();
    }
}