You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
4.1 KiB
157 lines
4.1 KiB
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<ExtendImage>() is ExtendImage iconImg)
|
|
{
|
|
slots[i].buffImage = iconImg;
|
|
}
|
|
else if (child.name == "fillImage" && child.GetComponent<Image>() 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;
|
|
}
|
|
}
|
|
}
|