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

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;
}
}
}