Script Execution Order 설정을 단순화한 SVG 도식입니다. 실제 Unity 화면 캡처가 아닙니다.
Script Execution Order 설정을 단순화한 SVG 도식입니다. 실제 Unity 화면 캡처가 아닙니다.

모든 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 프로젝트에서 직접 재현한 결과는 아닙니다.