
유니티에서 사용되는 기본 함수(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}");
}
}어떤 함수가 언제 어떻게 실행되는 지 로그를 통해 확인하실 수 있는 코드입니다.



