오늘은 유니티의 생명주기에 대해 정리해봤다. 생명주기를 제대로 이해하면 코드 실행 순서를 예측하고 최적화하는 데 큰 도움이 된다.
Unity 생명주기의 주요 메서드
오브젝트가 생성될 때 가장 먼저 호출된다.
주로 초기화 작업이나 싱글톤 패턴 구현 시 사용된다.
DontDestroyOnLoad 설정도 여기에서 주로 수행.
오브젝트가 활성화될 때 호출된다.
이벤트 등록이나 UI 갱신 등 활성화될 때 필요한 작업을 처리.
첫 프레임이 실행되기 직전에 호출된다.
Awake와 달리 다른 오브젝트와의 상호작용이 가능하다.
매 프레임마다 호출된다.
이동, 애니메이션, 입력 처리 등 매 프레임 실행이 필요한 작업을 처리.
물리 연산을 처리할 때 사용된다.
Update보다 일정한 간격으로 호출되므로 물리 연산의 정확도가 보장된다.
Update가 모두 실행된 후에 호출된다.
카메라 이동이나 UI 갱신 등 다른 오브젝트의 작업이 끝난 후 처리해야 하는 작업에 유용.
오브젝트가 비활성화될 때 호출된다.
이벤트 해제나 자원 정리 작업을 처리.
오브젝트가 제거될 때 호출된다.
메모리 누수를 방지하기 위한 자원 해제 작업에 주로 사용.
테스트 해보기
using UnityEngine;
using UnityEngine.SceneManagement;
public class LifeCycle : MonoBehaviour
{
private void Awake()
{
Debug.Log("스타트 awake" + SceneManager.GetActiveScene().name);
}
private void OnEnable()
{
Debug.Log("스타트 OnEnable"+ SceneManager.GetActiveScene().name);
}
// Start is called before the first frame update
void Start()
{
Debug.Log("스타트 Start" + SceneManager.GetActiveScene().name);
}
private void FixedUpdate()
{
}
// Update is called once per frame
void Update()
{
}
private void LateUpdate()
{
}
private void OnDisable()
{
Debug.Log("스타트 OnDisalbe" + SceneManager.GetActiveScene().name);
}
private void OnDestroy()
{
Debug.Log("스타트 OnDestroy" + SceneManager.GetActiveScene().name);
}
private void OnApplicationQuit()
{
}
public void SceneButton2()
{
SceneManager.LoadScene("SampleScene2");
}
public void SceneButton1()
{
SceneManager.LoadScene("SampleScene");
}
}

이러한 순서대로 로그가 찍히는것을 볼수있다.
플레이어 공격은 내가 커맨드패턴을 연습하다 로그가 찍힌것
생명주기 메서드의 호출 순서를 정확히 이해하면 의도치 않은 버그를 예방할 수 있다.
Update와 FixedUpdate를 적절히 구분해서 사용해야 한다는 점을 다시 한번 상기.
Awake와 Start의 차이를 명확히 이해하면 초기화 순서 관련 문제를 줄일 수 있다.
Unity 공식 문서: https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html