유니티 함수의 생명 주기 (Life cycle) [유니티 C#]

유니티에서 사용되는 기본 함수(Start, Update 등)은 각 역할에 따라 다른 생명 주기(Life cycle)를 갖습니다.
즉, 유니티가 함수를 호출하는 순서는 정해져 있습니다.

이를 스크립트의 실행 순서와 결합하면 안정성이 높은 코드를 만드실 수 있습니다!

OnTrigger, OnCollision 등의 함수는 추후에 다루어보고, 오늘은 가장 많이 사용되는 함수의 생명 주기를 알아보겠습니다.

  • 초기화(Initialization) 단계
  • 업데이트(Update) 단계
  • 해체(Decommission) 단계

1. 초기화(Initialization) 단계

초기화 단계의 대표적인 함수들로는 Awake, OnEnable, Start 함수가 있습니다. 각 함수 별 실행 순서와 용도, 특징은 아래와 같습니다.

Awake()
  • 순서: 프로그램 시작 시 가장 먼저 실행
  • 용도: 클래스 자신의 초기화 (싱글톤 패턴, 변수 할당 등)
  • 특징: 스크립트가 Disable 상태여도 실행. 단, 오브젝트가 비활성화 시에는 실행되지 않음
OnEnable()
  • 순서: Awake 실행 후에 실행
  • 용도: 이벤트 연결, 활성화 시 초기화가 필요한 경우
  • 특징: 오브젝트가 활성화 될 때마다 실행 (시작 시 오브젝트가 활성화 상태인 경우에도 실행)
Start()
  • 순서: 첫 프레임 업데이트 전에 실행 (OnEnable 후)
  • 용도: 다 클래스의 참조 등 초기화가 된 후의 데이터 접근
  • 특징: 초기화 단계 중 마지막이므로 타 클래스 참조에서 안전

Awake() -> OnEnable() -> Start()

2. 업데이트(Update) 단계

업데이트 단계의 함수들은 FixedUpdate를 제외하면 매 프레임 실행됩니다. 다만, 업데이트 단계 안에서도 함수의 실행 순서가 존재합니다.

각 함수가 물리 연산에 사용되는 지, 로직에 사용되는 지가 다르기 때문에 확인해두시면 유용합니다!

FixedUpdate()
  • 순서: 물리 시퀀스와 업데이트 단계 중 가장 먼저 호출 됨
  • 용도: 물리 연산에 사용 (Rigidbody 등)
  • 특징: 일정 시간(약 0.02초) 마다 호출되며, 게임의 프레임에 따라서 Update()보다 많이 호출될 수 있음
Update()
  • 순서: 게임 로직 시퀀스 중 가장 먼저 호출
  • 용도: 주요 게임 로직(사용자 입력, 타이머, 비물리 처리 등)
  • 특징: 프레임 단위 연산이기 때문에 사용 환경에 따라 호출 횟수가 달라질 수 있음
LateUpdate()
  • 순서: 게임 로직 시퀀스 중 가장 마지막에 호출
  • 용도: FixedUpdate, Update에서 값이 계산 된 후에 실행하는 로직
  • 특징: 주로 위치 연산이 끝난 후에 카메라의 이동을 처리할 때 사용

물리 시퀀스, 로직 시퀀스의 용어는 Unity에서 각 함수의 생명 주기와 용도에 따라 나눈 분류입니다.
자세한 내용은 유니티 매뉴얼에서 찾아보실 수 있습니다!

유니티 매뉴얼에 따르면 물리 시퀀스가 로직 시퀀스보다 먼저 처리되기에 FixedUpdate() 이후에 Update()가 실행됩니다.

3. 해체(Decommission) 단계

해체 단계는 게임오브젝트가 꺼지거나 파괴될 때 실행되는 단계입니다.

OnDisable()
  • 순서: 오브젝트가 비활성화 될 때마다 실행
  • 용도: 로직 중지, 불필요 연결 해제 (이벤트 해제, 코루틴 중지 등)
  • 특징: OnEnable()과 다르게 게임 시작 시 오브젝트가 비활성화 상태라면 실행되지 않음.
OnDestroy()
  • 순서: 오브젝트 파괴 시 실행
  • 용도: 메모리 정리, 영구적 연결 해제
  • 특징: 파괴 시 OnDisable()이 실행 된 후에 실행 됨

4. 예제 코드

C#
using UnityEngine;

public class GameManager : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log($"Awake {Time.deltatime}");
    }

    private void OnEnable()
    {
        Debug.Log($"OnEnable {Time.deltatime}");
    }

    private void Start()
    {
        Debug.Log($"Start {Time.deltatime}");
    }

    private void FixedUpdate()
    {
        Debug.Log($"FixedUpdate {Time.deltatime}");
    }

    private void Update()
    {
        Debug.Log($"Update {Time.deltatime}");
    }

    private void LateUpdate()
    {
        Debug.Log($"LateUpdate {Time.deltatime}");
    }

    private void OnDisable()
    {
        Debug.Log($"OnDisable {Time.deltatime}");
    }

    private void OnDestroy()
    {
        Debug.Log($"OnDestroy {Time.deltatime}");
    }
}

어떤 함수가 언제 어떻게 실행되는 지 로그를 통해 확인하실 수 있는 코드입니다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다