Skill 사용 시 CoolTime이 도는 이미지를 구현하기 위해 아래와 같이 코드를 작성하였다.
private void OnSkillChanged(SkillChangedEvent evt)
{
if (evt.slotIndex != slotIndex)
return;
//UI 갱신
if (evt.skillData == null)
{
// 빈 슬롯 표시
skillImage.sprite = null;
skillCoolTimeImage.sprite = null;
coolTimeColor.a = 0f;
color.a = 0f;
}
else
{
// 새 스킬 아이콘 표시
skillImage.sprite = evt.skillData.skillImage;
skillCoolTimeImage.sprite = evt.skillData.skillImage;
skillCoolTimeImage.type = Image.Type.Filled;
skillCoolTimeImage.fillOrigin = (int)Image.Origin360.Top; ;
skillCoolTimeImage.fillClockwise = false;
coolTimeColor.a = 1f;
color.a = 1f;
coolTime = evt.skillData.skillSO.coolTime;
}
skillImage.color = color;
skillCoolTimeImage.color = coolTimeColor;
}
private async UniTask CoolTimeFillAmount(SkillSlotData data)
{
if (data.index != slotIndex)
return;
cts?.Cancel();
cts = new CancellationTokenSource();
var token = cts.Token;
try
{
while (data.currentCoolTime > 0f)
{
if (skillCoolTimeImage == null) return;
skillCoolTimeImage.fillAmount = data.currentCoolTime / coolTime;
await UniTask.Yield(token);
}
if (skillCoolTimeImage != null)
skillCoolTimeImage.fillAmount = 0f;
}
catch (OperationCanceledException) // 중단되면 0으로
{
skillCoolTimeImage.fillAmount = 0f;
}
}
SkillChange가되면 skillCoolTimeImage에 sprite를 등록하고
해당 스킬의 coolTile 데이터를 받아서 현재 coolTime / 스킬의 coolTime 값으로 fillAmount를 조정해서 구현하고
중간에 skill 을 슬롯에서 빼내거나 다시 쿨타임이 돌게될 때 UniTask를 중간에 취소하게되면 fillAmount를 0으로 고정되도록 하였다.