와이유스토리

[유니티] Life Cycle & Start Coroutine 본문

프로젝트/게임

[유니티] Life Cycle & Start Coroutine

유(YOO) 2022. 12. 9. 20:58

유니티의 Life Cycle

Reset -> Awake -> OnEnable -> Start -> FixedUpdate -> Update -> LateUpdate -> OnDisable -> OnDestroy

 

유니티는 위의 사이클로 실행된다.

Update 함수는 주기적으로 한 프레임당 1번씩 실행되므로 주기(함수 호출 간격)이 일정하지 않다.

FixedUpdate 함수는 주기적으로 Fixed Time Step(약 0.02초)당 1번씩 실행되므로 주기가 일정하다. 주로 충돌 등 물리적 요소(Rigid Body)에 사용된다.

LateUpdate 함수는 Update 함수 실행 후 1번 호출된다. 주로 카메라 위치를 이동할 때 사용된다.

 

* FPS(Frame Rate) : 1초당 프레임 개수

ex) 50 FPS = 1초에 50프레임 = 매 프레임이 1/50=0.02초마다 실행

- 50 FPS -> 매 프레임마다 한 번씩 Update, FixedUpdate 함수 호출

ex) 25 FOS = 1초에 25프레임 = 매 프레임이 1/25=0.04초마다 실행
- 25 FPS -> 매 프레임마다 한 번씩 Update 호출, 두 번씩 FixedUpdate 호출

StartCoroutine

Update 함수 이후로 실행된다. LateUpdate 함수는 무조건 실행되나, StartCoroutine은 yield라는 제어권으로 함수 실행을 멈춘 후, 다음으로 넘어갈 수 있다.

yield return null; // 한 프레임 대기 후, 다음 프레임에서 다시 실행
yield return break; // 코루틴 강제 종료
yield return WaitForSeconds(float f); // 대기

아래 코드와 같이 반복문 안에 넣어 사용할 수 있다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UseCoroutine : MonoBehaviour
{
    float time = 0f;

    void Update() {
        StartCoroutine(startCoroutine());
    }

    IEnumerator startCoroutine() {
        while (time < 3) {
            time += Time.deltaTime;
            yield return null; // 한 프레임 대기 후 다시 실행
            yield return WaitForSeconds(1); // 1초 대기
        }
        time = 0;
        yield return break; // 코루틴 종료
    }
}

StartCoroutine의 장단점

장점

1. 원하는 타이밍, 복잡한 시간 제한 기능에서 유용하며, 필요한 부분만 작동시킬 수 있다.

2. Update와 별개로 관리할 수 있으므로 편하다.

 

단점

1. 직관적이지 못해 코드 해석이 어려워지며, 직접 종료시켜야 되는 번거로움이 있다.

2. new 연산자와 함께 사용하면 Garvage(쓰레기 메모리) 때문에 메모리 낭비가 심하다. 캐시를 이용해 해결할 수 있지만 코드가 길어진다.

​3. 코루틴 자체로 메모리 낭비가 발생할 수 있다. 코루틴을 자주 켰다껐다하면 낭비가 심하다.

 

Comments