라이프 사이클 (Life Cycle)

김기훈·2025년 2월 21일
0

Unity

목록 보기
3/7

유니티 생명주기

오브젝트는 Scene에 있는 동안 엔진에서 일정한 흐름에 따라 자동으로 함수를 호출하는데, 이 패턴의 흐름을 생명주기(Life Cycle)라 부른다.

refer : Unity Doc_스크립트 라이프사이클 플로우차트 URL

Awake

씬(Scene)에 배치된 게임 오브젝트가 활성화될 때 가장 먼저 실행된다. (스크립트 활성화 여부는 상관없다.)
Instantiate()로 게임 오브젝트를 생성할 때도 실행됨.
비활성화된 오브젝트는 Awake()가 호출되지 않음 (SetActive(false) 상태일 경우).

▪️주의점

  1. 같은 오브젝트의 컴포넌트는 접근 가능하지만, 다른 오브젝트의 컴포넌트는 접근 보장되지 않음.
  2. 게임이 시작될 때 한 번만 실행되며, 오브젝트가 비활성화된 경우 실행되지 않음.
  3. 데이터 초기화, 컴포넌트 설정, 싱글톤 구현 등에 적합함.
  4. 다른 오브젝트와 상호작용이 필요하면 Start()에서 처리하는 것이 더 안전함

Start

오브젝트가 활성화된 후, 첫 번째 프레임에서 실행됨.
Awake() 이후 실행되며, 게임이 시작된 후 딱 한 번만 호출됨.
Instantiate()로 생성한 오브젝트도 첫 프레임에서 실행됨.
오브젝트가 비활성화된 상태였다가 활성화되면 다시 호출됨.

▪️호출 순서

  1. Awake → 객체 생성 직후 실행
  2. OnEnable → 활성화 시 실행
  3. Start → 첫 번째 프레임에서 실행

▪️Awake vs Start

AwakeStart
호출 시점오브젝트 생성시 가장 먼저 한번만 호출객체 실행시 첫 프레임에 한번만 호출
목적초기화 (데이터 로드, 컴포넌트 설정)다른 오브젝트와의 상호작용 준비
다른 오브젝트 접근같은 오브젝트의 컴포넌트는 안전하게 접근할 수 있지만, 다른 오브젝트의 컴포넌트는 아직 초기화되지 않았을 수 있음.같은 오브젝트뿐만 아니라, 다른 오브젝트의 컴포넌트에도 안전하게 접근 가능.

▪️사용법

  1. 다른 오브젝트의 컴포넌트 가져오기
    Start 에서는 다른 오브젝트도 이미 생성된 상태이기에, 안전하게 찾을 수 있음 (Awake에서 초기화하고, Start 에서 연결)
  2. 코루린 시작하기StartCoroutine()
    Start 는 코루틴을 시작하는 용도로 많이 사용된다.
  3. Start는 오브젝트가 빌활성화 된 상태에서는 실행되지 않음
    Start는 게임 오브젝트가 생성후 활성화 될 때, 첫 번째 프레임에서 단 한번만 실행된다. 때문에 이후 비활성화 후 다시 활성화해도 Start는 실행되지 않는다. (OnEnable() 활용할 것)

FixedUpdate & Update & LateUpdate

Unity에서 프레임마다 실행되는 대표적인 3가지 업데이트 함수인 Update(), FixedUpdate(), LateUpdate()는 각각 다른 역할을 가지고 있다.

▪️FixedUpdate

고정된 시간 간격으로 실행됨 (Time.fixedDeltaTime 기본 0.02초)
물리 연산(Physics) 업데이트를 위함 함수로 RigidBody를 사용한 움직임을 처리할 때 사용해야함
Unity의 물리 엔진이 일정한 간격으로 실행하는 함수로, 프레임 속도와 무관하게 항상 같은 간격으로 실행됨

▪️Update

매 프레임마다 실행됨 (Time.deltaTime 프레임 속도에 따라 실행 빈도가 달라짐)
FPS가 높으면 더 자주 실행되고, FPS가 낮으면 실행 횟수가 줄어듦
사용자 입력처리, 애니메이션 업데이트, 비 물리적 객체 이동에 사용

▪️LateUpdate

Update 실행 이후 실행됨
카메라 추적, 애니메이션 후처리, 보정 작업 등에 사용됨
Update에서 오브젝트의 위치가 변경된 후 LateUpdate에서 따라가도록 하면, 카메라가 부드럽게 움직일 수 있음.

▪️비교 정리

LateUpdateUpdateFixedUpdate
실행주기일정한 시간 간격(물리 연산 주기)매 프레임 실행 (FPS에 따라 다름)Update 실행 후 실행
사용목적물리 연산사용자 입력, 애니메이션, 일반적인 업데이트카메라 추적, 애니메이션 보정
프레임 속도와 관계항상 일정한 속도로 실행프레임 속도에 따라 실행 횟수 달라짐Update 끝난 후 실행
Rigidbody 적용물리 연산 담당사용하면 안됨사용하면 비효율적
주요 사용처중력, 물리 충돌 처리캐릭터 이동, UI 업데이트, 입력 처리카메라 움직임, 후처리

OnEnable & OnDisable

게임 오브젝트 또는 컴포넌트가 활성화되거나 비활성화될 때 자동으로 호출되는 함수

▪️OnEnable

게임 오브젝트 또는 스크립트가 활성화 될 때 호출
씬이 로드되거나, SetActive(true), 또는 컴포넌트가 활성화될 때 실행됨
비활성화된 후 다시 활성화되면 다시 실행됨
Start 보다 먼저 실행된다. ( Awake -> OnEnable -> Start )

▪️OnDisable

게임 오브젝트 또는 스크립트가 비활성화될 때 자동으로 호출됨
씬이 전환될 때, SetActive(false), 또는 컴포넌트가 비활성화될 때 실행됨

OnDestroy

Unity에서 게임 오브젝트 또는 스크립트가 삭제될 때 자동으로 호출되는 함수
오브젝트가 제거될 때 정리 작업을 수행하거나 메모리 누수를 방지할 수 있다.

▪️특징

  1. Destroy 로 오브젝트 삭제시 실행됨
  2. 씬이 전환될 때 실행됨
  3. DontDestroyOnLoad 사용 시 씬이 바뀌어도 오브젝트가 유지되기 때문에 OnDestroy()가 실행되지 않음

▪️주요 사용처

  1. 이벤트 해제 (메모리 누수 방지)
void OnEnable()
{
    EventManager.OnPlayerDied += ShowGameOverScreen;
}

void OnDisable()
{
    EventManager.OnPlayerDied -= ShowGameOverScreen;
}

void OnDestroy()
{
    EventManager.OnPlayerDied -= ShowGameOverScreen;
}
  1. 네트워크 연결 해제
void OnDestroy()
{
    NetworkManager.Disconnect(); // 네트워크 연결 해제
}
  1. 게임 데이터 저장
void OnDestroy()
{
    PlayerPrefs.SetInt("HighScore", highScore);
    PlayerPrefs.Save();
}
profile
Late Bloomer

0개의 댓글