
Unity 스크립트가 실행되면 순차적으로 이벤트 함수들이 호출된다.
객체가 생성되어 활성화, 업데이트, 파괴되는 과정을 생명주기라고 한다.
Awake()는 데이터를 초기화하는 목적으로 만들어진 이벤트 함수다. 씬이 실행된 직후에 1회 호출된다.
| 게임 오브젝트 | 컴포넌트 | 실행 |
|---|---|---|
| 활성화 | 활성화 | O |
| 활성화 | 비활성화 | O |
| 비활성화 | 활성화 | X |
| 비활성화 | 비활성화 | X |
OnEnable()은 MonoBehaviour 객체가 생성되어 활성화될 때 발생한다.
| 게임 오브젝트 | 컴포넌트 | 실행 |
|---|---|---|
| 활성화 | 활성화 | O |
| 활성화 | 비활성화 | X |
| 비활성화 | 활성화 | X |
| 비활성화 | 비활성화 | X |
OnEnable()은 각 컴포넌트의 Awake()가 호출된 직후에 실행된다.

게임 오브젝트에 컴포넌트를 처음 연결하거나 에디터에서 Reset을 클릭할 때 호출된다.
컴포넌트의 프로퍼티를 초기화하기 위해서 사용한다.

게임 오브젝트의 컴포넌트가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출된다.
런타임 전에 씬에 배치된 게임 오브젝트의 경우 모든 스크립트에 대해 Update() 이전에 Start()가 호출됨이 보장된다. 그러나 런타임에 게임 오브젝트를 인스턴스화 하는 경우에는 다르다.
런타임에 게임 오브젝트를 인스턴스화 하는 경우, Start()는 인스턴스화 된 프레임의 다음 프레임에 호출된다.
private void Start()
{
Debug.Log("Start() 호출");
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Debug.Log("인스턴스화");
Instantiate(this);
Debug.Log("인스턴화 완료");
}
}

결과적으로 초기화 함수의 호출 순서는 Awake() → OnEnable() → Start()이지만, 이 순서대로가 아닌 Update() 호출 직전에 Start()가 호출된다고 생각해야 맞다.
또한, 씬에 게임 오브젝트나 컴포넌트가 둘 중 하나라도 비활성화된 경우, 처음 활성화가 될 때 1회 호출된다.
| 게임 오브젝트 | 컴포넌트 | 실행 |
|---|---|---|
| 활성화 | 활성화 | O |
| 활성화 | 비활성화 | X |
| 비활성화 | 활성화 | X |
| 비활성화 | 비활성화 | X |
OnApplicationPause()는 일시 정지가 감지된 프레임과 그 다음 프레임 사이에 호출된다.
프레임과 프레임 사이에서 일시 정지가 되고 끝나는 것이 아니라 일시 정지를 시각화하기 위한 작업을 위해 한 프레임을 더 소모하여 일시 정지임을 나타낸다.
FixedUpdate()는 프레임에 영향을 받지 않고 정해진 횟수만큼 호출된다.
기본 값은 0.02로 1초에 50회 호출된다.
Edit-Project Setting-Time의 "Fixed Timestep"에서 호출 주기를 설정할 수 있다.
정해진 횟수만큼 호출됨을 보장하기 때문에 FixedUpdate()에서 물리 연산을 진행할 때 Time.deltaTime을 곱할 필요가 없다.
FixedUpdate()가 호출된 직후 물리 계산 및 업데이트가 발생한다.
| 게임 오브젝트 | 컴포넌트 | 실행 |
|---|---|---|
| 활성화 | 활성화 | O |
| 활성화 | 비활성화 | X |
| 비활성화 | 활성화 | X |
| 비활성화 | 비활성화 | X |
Update()는 프레임 당 한 번 호출된다. 하지만 프레임이 업데이트되는 시간은 일정하지 않기 때문에, Time.deltaTime은 항상 달라진다.
코루틴은 Update()가 반환된 직후에 업데이트된다.
| 게임 오브젝트 | 컴포넌트 | 실행 |
|---|---|---|
| 활성화 | 활성화 | O |
| 활성화 | 비활성화 | X |
| 비활성화 | 활성화 | X |
| 비활성화 | 비활성화 | X |
LateUpdate()는 각 컴포넌트의 Update()가 실행된 이후에 호출된다.
LateUpdate()는 Update()의 계산이 끝났다는 것을 보장하므로, Update() 계산 이후에 호출할 필요가 있는 행동들에 주로 사용된다.
| 게임 오브젝트 | 컴포넌트 | 실행 |
|---|---|---|
| 활성화 | 활성화 | O |
| 활성화 | 비활성화 | X |
| 비활성화 | 활성화 | X |
| 비활성화 | 비활성화 | X |
OnApplicationQuit()은 애플리케이션이 종료되기 전, 모든 게임 오브젝트에서 1회 호출된다.
에디터에서는 Play Mode가 종료될 때 호출된다.
| 게임 오브젝트 | 컴포넌트 | 실행 |
|---|---|---|
| 활성화 | 활성화 | O |
| 활성화 | 비활성화 | O |
| 비활성화 | 활성화 | X |
| 비활성화 | 비활성화 | X |
OnDisable()은 게임 오브젝트나 컴포넌트가 비활성화 될 때 호출되며, OnEnable()의 역기능을 한다.
| 게임 오브젝트 | 컴포넌트 | 실행 |
|---|---|---|
| 활성화 | 활성화 | X |
| 활성화 | 비활성화 | O |
| 비활성화 | 활성화 | O |
| 비활성화 | 비활성화 | O |
OnDestroy()는 게임 오브젝트가 파괴될 때 호출되며, 씬의 모든 업데이트 이후 호출된다.
씬 전환 및 종료 시, 그리고 게임 종료 시에도 게임 오브젝트가 파괴되므로 호출된다.
| 게임 오브젝트 | 컴포넌트 | 실행 |
|---|---|---|
| 활성화 | 활성화 | O |
| 활성화 | 비활성화 | X |
| 비활성화 | 활성화 | X |
| 비활성화 | 비활성화 | X |
애니메이션 업데이트, 렌더링, 코루틴은 생명 주기 설명에서 제외했으므로 더 자세한 내용은 공식 문서를 참고하면 될 것 같다.