모든 Awake 뒤의 Start와 Awake끼리의 순서를 구분합니다
초기 씬의 활성 오브젝트에서는 모든 Awake 호출이 끝난 뒤 Start가 호출됩니다. 따라서 생산자의 Awake와 소비자의 Start로 역할을 나누는 것은 문서화된 해결책입니다. 하지만 서로 다른 두 Awake의 상대 순서는 같은 실행 순서 값에서 보장되지 않습니다. 동적으로 생성한 오브젝트, 처음에 비활성인 오브젝트, additive 씬까지 섞이면 명시적인 준비 신호가 더 안전합니다.
using System;
using UnityEngine;
[DefaultExecutionOrder(-100)]
public sealed class GameBootstrap : MonoBehaviour
{
public static bool IsReady { get; private set; }
public static event Action Ready;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void ResetStatics()
{
IsReady = false;
Ready = null;
}
private void Awake()
{
IsReady = true;
Ready?.Invoke();
}
}숫자를 넣기 전에 준비 완료를 전달합니다
Script Execution Order는 실제로 전역인 의존성이 몇 개 남지 않았을 때 쓰는 도구입니다. 다른 컴포넌트가 준비 시점을 알아야 한다면 이벤트나 명시적인 Initialize 호출이 읽기 쉽습니다. 아래 코드는 늦게 구독한 경우까지 IsReady로 처리합니다. 위의 정적 초기화는 Domain Reload를 꺼 둔 Play Mode와 씬 재진입에서 이전 true와 구독자가 남지 않게 합니다.
using UnityEngine;
public sealed class HudBinder : MonoBehaviour
{
[SerializeField] private GameObject panel;
private void OnEnable()
{
GameBootstrap.Ready += Show;
if (GameBootstrap.IsReady)
Show();
}
private void OnDisable()
{
GameBootstrap.Ready -= Show;
}
private void Show()
{
panel.SetActive(true);
}
}Project Settings와 attribute를 함께 확인합니다
코드의 DefaultExecutionOrder 값은 Project Settings 창에 자동으로 나타나지 않습니다. 같은 타입에 다른 값이 UI에 저장돼 있으면 에디터 설정이 우선합니다. 숫자를 바꾼 뒤에는 두 설정을 함께 확인하세요. additive 씬과 런타임 생성 오브젝트의 Awake는 초기 씬의 일괄 초기화와 같은 경계로 묶이지 않으므로, 다른 씬 오브젝트가 이미 준비됐다고 추정하지 말고 준비 신호를 확인해야 합니다.
공식 문서 대조
검증일
Unity 6 공식 문서와 코드 경로를 대조했습니다. 별도 Unity 프로젝트에서 직접 재현한 결과는 아닙니다.