같은 실행 순서는 보장되지 않습니다
Unity는 MonoBehaviour의 이벤트를 정해진 흐름으로 호출하지만, 같은 실행 순서 값을 가진 서로 다른 스크립트의 상대적인 순서까지 보장하지는 않습니다. 에디터에서 늘 먼저 실행되는 것처럼 보여도 빌드나 씬 구성에 따라 달라질 수 있습니다. Awake와 Start의 이름만 바꿔서는 의존성이 해결되지 않습니다.
using System;
using UnityEngine;
[DefaultExecutionOrder(-100)]
public sealed class GameBootstrap : MonoBehaviour
{
public static bool IsReady { get; private set; }
public static event Action Ready;
private void Awake()
{
IsReady = true;
Ready?.Invoke();
}
}숫자를 넣기 전에 준비 완료를 전달합니다
Script Execution Order는 실제 의존성이 몇 개 남지 않았을 때 쓰는 도구입니다. 초기화 순서를 다른 컴포넌트가 알아야 한다면 이벤트나 명시적인 Initialize 호출이 읽기 쉽습니다. 아래 코드는 이벤트가 먼저 발생한 경우까지 IsReady로 처리해 소비자가 우연한 순서에 기대지 않게 합니다.
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에 저장돼 있으면 에디터 설정이 우선합니다. 숫자를 바꾼 뒤에는 Project Settings와 attribute 양쪽을 모두 확인하고, additive 씬에서도 의존성이 깨지지 않는지 테스트하세요.
확인한 공식 문서Unity Script Execution Order 매뉴얼 ↗