Fire 이미지를 통해 부스터 게이지 표현 ( 이건 구현 완료 )
그리고 Filled Amount가 일정 값 이상 초과 시, 코루틴 시스템을 이용하여 쿨다운을 표현
왜 1이 아니라 일정 값 이상 초과하냐면 Fire Image 자체가 윗 부분이 얇기 때문에 0.95정도만 돼도 1이 돼보인다.
즉, 쿨다운을 할때 게이지가 한번에 줄어드는 것이 아니라 서서히 줄어 드는 것을 하기 위해 코루틴을 사용
Fade In을 통해서 살펴볼 것이 있음
void Start()
{
FadeIn();
}
void FadeIn()
{
while(alpha < 1.of)
{
alpha += Time.deltaTime / fadeTime;
image.color = new Color(1, 1, 1, alpha);
}
}
이렇게 하면 결과가 그냥 이미지 자체가 FadeIn이 완료된 상태로 바로 나옴
한 프레임안에서 저 while 계산을 전부 다 끝내니까 화면으론 결과가 바로 나오는 것
( 변화 과정을 인식하지 못함 )
void Update()
{
FadeIn();
}
void FadeIn()
{
while (alpha < 1.0f)
{
alpha += Time.deltaTime / fadeTime;
image.color = new Color(1, 1, 1, alpha);
}
}
Update에 While 루프는 문제가 크다.
void Update()
{
// 그냥 FadeIn()을 없앰
if (alpha < 1.0f)
{
alpha += Time.deltaTime / fadeTime;
image.color = new Color(1, 1, 1, alpha);
}
}
Update는 매 프레임마다 실행되니까 그냥 FadeIn() 함수에서 while 대신 if 로만 해주면 됨.
근데 이게 한계가 있음
예를 들어 지금 내가 만들려는 게임처럼 CoolDown 이라는 함수가 한번만 실행이 돼야하며,
그 한번만 실행이 되는데 매프레임마다 조금씩 Image FillAmount를 감소시켜야함
이때 코루틴을 사용하면 됨
현재, 좀비를 죽일때마다 boosterImage.fillAmount += 0.25f 를 해주고 있는 상황
이것은 Update에서 실행되는 것처럼 매 프레임 실행 되는 것이 아니라
좀비를 쳤을때 마다 실행되고 확인하는 한 프레임안에서 벌어지는 것이다.
=> BoosterUp() 메소드
그 boosterImage.fillAmount가 0.95 이상인 경우 CoolDown을 해주면 된다.
public void BoosterUp()
{
// 쿨다운 도중이면 boosterImage 바로 0으로
if (cooldown)
{
boosterImage.fillAmount = 0.0f;
cooldown = false;
}
boosterImage.fillAmount += 0.25f;
// 다 찼다면
if (boosterImage.fillAmount >= 0.95)
{
overlapBoosterCnt++;
boosterCnt.text = overlapBoosterCnt.ToString();
// 이미지 쿨다운
StartCoroutine(CoolDownBooster());
}
}
IEnumerator CoolDownBooster()
{
while (boosterImage.fillAmount > 0.0f)
{
cooldown = true;
boosterImage.fillAmount -= Time.deltaTime / coolDownTime;
yield return null;
if (boosterImage.fillAmount < 0)
{
boosterImage.fillAmount = 0;
}
}
}
이렇게 하면 매프레임 호출하지 않아도 되고 로직적으로도 더 완성도가 있다.
저 bool cooldown 변수 부분은 만약 쿨다운 도중에 좀비를 공격했다면
즉시 다시 게이지가 차오르게 했다.
어쨋거나 쿨다운을 한다는 것은 결과적으로 boosterImage.fillAmount가 0이라는 소리니까.