Unity Skill CoolTime 이미지 구현

이시율·2025년 7월 10일

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으로 고정되도록 하였다.

0개의 댓글