게임에서 코루틴 유용한 사용법

devKyoun·2024년 11월 4일
0

Unity

목록 보기
24/27

🚩 목표

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 루프는 문제가 크다.

  • 이 또한, 한 프레임 안에서 참인 동안 루프를 돌며 Alpha를 업데이트 한다.
  • 이 방식도 한 프레임 안에서 모든 계산을 끝내기 때문에 위와 결과가 같다.
  • 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이라는 소리니까.

profile
Game Developer

0개의 댓글