using System; using UnityEngine; using UnityEngine.UI; public partial class GamePlayBuffCoolTimeView : View { [SerializeField] SlotUI[] slots; int activeBuffCount = 0; private void Start() { for (int i = 0; i < slots.Length; ++i) { slots[i].SetBuffData(null); } Show(); } private void Update() { for (int i = 0; i < activeBuffCount; i++) { var slot = slots[i]; if (slot.buffData is null) continue; slot.Update(); if (slot.buffData.RemainTime <= 0) { for (int j = i; j < activeBuffCount - 1; j++) { BuffData tmp; tmp = slots[j].buffData; slots[j].SetBuffData(slots[j + 1].buffData); slots[j + 1].SetBuffData(tmp); } activeBuffCount--; slots[activeBuffCount].SetBuffData(null); i--; } } } public override void Show() { GamePlayBuffMgr.Instance.OnChanged += RefreshBuffList; viewState = ViewState.Shown; gameObject.SetActive(true); } public override void Hide() { gameObject.SetActive(false); viewState = ViewState.Hidden; GamePlayBuffMgr.Instance.OnChanged -= RefreshBuffList; } public void RefreshBuffList(BuffData buffData, bool added) { if (added) { Debug.Assert(activeBuffCount + 1 < slots.Length, "Buff count exid slot count"); activeBuffCount++; slots[activeBuffCount - 1].SetBuffData(buffData); } else { for (int i = 0; i < activeBuffCount; i++) { if (slots[i].buffData == buffData) { for (int j = i; j < activeBuffCount - 1; j++) { BuffData tmp; tmp = slots[j].buffData; slots[j].SetBuffData(slots[j + 1].buffData); slots[j + 1].SetBuffData(tmp); } activeBuffCount--; slots[activeBuffCount].SetBuffData(null); break; } } } } #if UNITY_EDITOR [ContextMenu("Set Slots")] private void SetSlots() { slots = new SlotUI[transform.childCount]; for (int i = 0; i < transform.childCount; i++) { var slot = transform.GetChild(i); slots[i].root = slot.gameObject; for (int j = 0; j < slot.childCount; j++) { var child = slot.GetChild(j); if (child.name == "iconImage" && child.GetComponent() is ExtendImage iconImg) { slots[i].buffImage = iconImg; } else if (child.name == "fillImage" && child.GetComponent() is Image fillImage) { slots[i].remainTimeFillImg = fillImage; } } } } #endif } public partial class GamePlayBuffCoolTimeView : View { [Serializable] struct SlotUI { public GameObject root; public ExtendImage buffImage; public Image remainTimeFillImg; public BuffData buffData { get; private set; } public void SetBuffData(BuffData buffData) { this.buffData = buffData; if(buffData is null) { root.SetActive(false); } else { root.SetActive(true); buffImage.SetImageInAtlasAsync(buffData.IconImgAtlasName, buffData.IconImgNameInAtlas); } } public void Update() { if (remainTimeFillImg is null) return; float fillRate = 0f; if(!buffData.IsInfiniteDuration) fillRate = buffData.ElapsedDuration / buffData.Duration; remainTimeFillImg.fillAmount = fillRate; } } }