유니티 스크립트의 대두분은 Monobehaviour 클래스를 상속받아 만들어진다. 이 클래스를 상속받은 오브젝트는 Scene에 있는 동안 엔진에서 일정한 흐름에 따라 자동으로 함수를 호출하는데, 이 패턴의 흐름을 생명 주기(Life Cycle)라 부른다.


using UnityEngine;
public class LifeCycleExample : MonoBehaviour
{
// 1️⃣ 오브젝트가 생성될 때 단 한 번 실행 (가장 먼저 실행됨)
void Awake()
{
Debug.Log("1️⃣ Awake() - 오브젝트가 생성됨");
}
// 2️⃣ 오브젝트가 활성화될 때 실행됨
void OnEnable()
{
Debug.Log("2️⃣ OnEnable() - 오브젝트가 활성화됨");
}
// 3️⃣ Start()는 게임이 시작될 때 단 한 번 실행됨 (Awake() 후 실행)
void Start()
{
Debug.Log("3️⃣ Start() - 게임 시작");
}
// 4️⃣ 매 프레임마다 실행 (게임 로직 업데이트)
void Update()
{
Debug.Log("4️⃣ Update() - 매 프레임 실행");
}
// 5️⃣ 모든 Update()가 끝난 후 실행 (오브젝트의 위치 조정 등에 활용)
void LateUpdate()
{
Debug.Log("5️⃣ LateUpdate() - Update() 실행 후 실행");
}
// 6️⃣ 물리 연산에 최적화된 고정된 시간 간격으로 실행 (물리 관련 로직)
void FixedUpdate()
{
Debug.Log("6️⃣ FixedUpdate() - 물리 연산 실행");
}
// 7️⃣ 오브젝트가 비활성화될 때 실행
void OnDisable()
{
Debug.Log("7️⃣ OnDisable() - 오브젝트가 비활성화됨");
}
// 8️⃣ 오브젝트가 제거될 때 실행 (게임 종료 또는 Destroy() 호출 시)
void OnDestroy()
{
Debug.Log("8️⃣ OnDestroy() - 오브젝트가 삭제됨");
}
}
추가)

FixedUpdate()는 고정된 시간 간격(기본값 0.02초, 50FPS)으로 실행됩니다.
즉, 게임의 프레임 레이트가 높거나 낮아질 경우 Update()보다 FixedUpdate()가 더 자주 실행되거나 덜 실행될 수 있습니다.
Update() → 플레이어 입력, UI, 애니메이션 업데이트
FixedUpdate() → 물리 연산 (Rigidbody, Force, Collision 등)
Update()는 매 프레임 실행되고, FixedUpdate()는 일정한 물리 업데이트 간격으로 실행된다.
추가)

Awake() → 객체가 생성되면 가장 먼저 호출됨
OnEnable() → Awake() 후 객체가 활성화되면 실행됨
SetActive(false) 했다가 다시 true로 만들면? Awake()는 다시 실행되지 않지만, OnEnable()은 다시 실행됨

Awake()를 사용할 때
객체의 기본 데이터를 초기화해야 할 때
다른 컴포넌트의 참조를 설정해야 할 때
게임이 시작되면 한 번만 설정해야 하는 작업 (예: 싱글톤 인스턴스 설정)
OnEnable()을 사용할 때
객체가 활성화될 때마다 실행해야 하는 코드 (예: UI 업데이트)
SetActive(true) 될 때마다 특정 동작을 수행해야 할 때
이벤트 리스너를 추가할 때 (ex: EventManager.OnEvent += SomeFunction;)