
오브젝트는 Scene에 있는 동안 엔진에서 일정한 흐름에 따라 자동으로 함수를 호출하는데, 이 패턴의 흐름을 생명주기(Life Cycle)라 부른다.
refer : Unity Doc_스크립트 라이프사이클 플로우차트 URL
씬(Scene)에 배치된 게임 오브젝트가 활성화될 때 가장 먼저 실행된다. (스크립트 활성화 여부는 상관없다.)
Instantiate()로 게임 오브젝트를 생성할 때도 실행됨.
비활성화된 오브젝트는 Awake()가 호출되지 않음 (SetActive(false) 상태일 경우).
오브젝트가 활성화된 후, 첫 번째 프레임에서 실행됨.
Awake() 이후 실행되며, 게임이 시작된 후 딱 한 번만 호출됨.
Instantiate()로 생성한 오브젝트도 첫 프레임에서 실행됨.
오브젝트가 비활성화된 상태였다가 활성화되면 다시 호출됨.
| Awake | Start | |
|---|---|---|
| 호출 시점 | 오브젝트 생성시 가장 먼저 한번만 호출 | 객체 실행시 첫 프레임에 한번만 호출 |
| 목적 | 초기화 (데이터 로드, 컴포넌트 설정) | 다른 오브젝트와의 상호작용 준비 |
| 다른 오브젝트 접근 | 같은 오브젝트의 컴포넌트는 안전하게 접근할 수 있지만, 다른 오브젝트의 컴포넌트는 아직 초기화되지 않았을 수 있음. | 같은 오브젝트뿐만 아니라, 다른 오브젝트의 컴포넌트에도 안전하게 접근 가능. |
StartCoroutine()OnEnable() 활용할 것)Unity에서 프레임마다 실행되는 대표적인 3가지 업데이트 함수인 Update(), FixedUpdate(), LateUpdate()는 각각 다른 역할을 가지고 있다.
고정된 시간 간격으로 실행됨 (Time.fixedDeltaTime 기본 0.02초)
물리 연산(Physics) 업데이트를 위함 함수로 RigidBody를 사용한 움직임을 처리할 때 사용해야함
Unity의 물리 엔진이 일정한 간격으로 실행하는 함수로, 프레임 속도와 무관하게 항상 같은 간격으로 실행됨
매 프레임마다 실행됨 (Time.deltaTime 프레임 속도에 따라 실행 빈도가 달라짐)
FPS가 높으면 더 자주 실행되고, FPS가 낮으면 실행 횟수가 줄어듦
사용자 입력처리, 애니메이션 업데이트, 비 물리적 객체 이동에 사용
Update 실행 이후 실행됨
카메라 추적, 애니메이션 후처리, 보정 작업 등에 사용됨
Update에서 오브젝트의 위치가 변경된 후 LateUpdate에서 따라가도록 하면, 카메라가 부드럽게 움직일 수 있음.
| LateUpdate | Update | FixedUpdate | |
|---|---|---|---|
| 실행주기 | 일정한 시간 간격(물리 연산 주기) | 매 프레임 실행 (FPS에 따라 다름) | Update 실행 후 실행 |
| 사용목적 | 물리 연산 | 사용자 입력, 애니메이션, 일반적인 업데이트 | 카메라 추적, 애니메이션 보정 |
| 프레임 속도와 관계 | 항상 일정한 속도로 실행 | 프레임 속도에 따라 실행 횟수 달라짐 | Update 끝난 후 실행 |
| Rigidbody 적용 | 물리 연산 담당 | 사용하면 안됨 | 사용하면 비효율적 |
| 주요 사용처 | 중력, 물리 충돌 처리 | 캐릭터 이동, UI 업데이트, 입력 처리 | 카메라 움직임, 후처리 |
게임 오브젝트 또는 컴포넌트가 활성화되거나 비활성화될 때 자동으로 호출되는 함수
게임 오브젝트 또는 스크립트가 활성화 될 때 호출
씬이 로드되거나, SetActive(true), 또는 컴포넌트가 활성화될 때 실행됨
비활성화된 후 다시 활성화되면 다시 실행됨
Start 보다 먼저 실행된다. ( Awake -> OnEnable -> Start )
게임 오브젝트 또는 스크립트가 비활성화될 때 자동으로 호출됨
씬이 전환될 때, SetActive(false), 또는 컴포넌트가 비활성화될 때 실행됨
Unity에서 게임 오브젝트 또는 스크립트가 삭제될 때 자동으로 호출되는 함수
오브젝트가 제거될 때 정리 작업을 수행하거나 메모리 누수를 방지할 수 있다.
void OnEnable()
{
EventManager.OnPlayerDied += ShowGameOverScreen;
}
void OnDisable()
{
EventManager.OnPlayerDied -= ShowGameOverScreen;
}
void OnDestroy()
{
EventManager.OnPlayerDied -= ShowGameOverScreen;
}
void OnDestroy()
{
NetworkManager.Disconnect(); // 네트워크 연결 해제
}
void OnDestroy()
{
PlayerPrefs.SetInt("HighScore", highScore);
PlayerPrefs.Save();
}