
개발을 진행하다 보면 스크립트의 실행 순서를 지정해야 될 순간이 오게 됩니다.
오늘은 스크립트의 실행 순서를 제어하는 2가지 방법에 대해서 살펴보겠습니다!
- 에디터 내 ‘Script Execution Order’를 사용하는 방법
- [DefaultExecutionOrder] 어트리뷰트를 사용하는 방법
1. 왜 필요할까?
지난번에 구현했던 싱글톤 패턴에서 스크립트의 실행 순서를 설정해야 되는 대표적인 상황이 있습니다.
using UnityEngine;
public class GameManager : MonoBehaviour
{
// 게임 점수
public int score;
// 싱글톤 인스턴스
public static GameManager instance;
private void Awake()
{
// 싱글톤 인스턴스 생성
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}using UnityEngine;
public class ScoreDisplay : MonoBehaviour
{
private void Awake()
{
Debug.Log($"현재 점수 : {GameManager.instance.score}");
}
}GameManager가 Awake 함수에서 싱글톤 인스턴스를 생성합니다.
그리고 ScoreDisplay 스크립트에서도 Awake 함수에서 GameManager의 인스턴스에 접근하여 score 변수를 가져오는 간단한 코드를 작성해보았습니다.
실제로 코드를 실행시켜보면 어떻게 될까요?

접근하는 대상이 NULL일 때 발생하는 ‘NullReferenceException’ 에러가 발생할 수 있습니다.
에러 로그를 읽어보면 ScoreDisplay스크립트의 7번째 줄
Debug.Log($”현재 점수 : {GameManager.instance.score}”);
부분에서 에러가 발생합니다.
위 경우에서 에러가 발생한 이유는 GameManager에서 싱글톤 인스턴스를 생성하기 전에 ScoreDisplay스크립트가 실행되었기 때문입니다.
이처럼 Awake나 Start 같은 동일한 생명주기 함수 내에서는, 누가 먼저 실행될지 보장할 수 없습니다.
따라서 명시적으로 순서를 정해주지 않으면 NullReferenceException같은 에러를 마주하게 됩니다.
2. Script Execution Order를 사용하는 방법
유니티 에디터에서는 [Script Execution Order] 기능을 통해 스크립트의 실행 순서를 직관적으로 제어할 수 있습니다.
[Edit] – [Project Settings] –[Script Execution Order]

우측 하단 ‘+’ 버튼을 통해 실행 순서를 제어 할 스크립트를 추가할 수 있습니다.
스크립트명 우측의 값이 낮을수록 먼저 실행되게 됩니다.

이전의 문제를 해결하기 위해 GameManager가 ScoreDisplay보다 먼저 실행되도록 조정했습니다.
실행 순서를 조정하지 않은 스크립트들은 [DefaultTime] 슬롯에서 실행됩니다.
DefaultTime 슬롯은 음수 순서 번호가 있는 스크립트 다음에, 그리고 양수 순서 번호가 있는 스크립트 이전에 실행됩니다.
(위 경우에서는 -1 다음 10 이전에 실행됩니다.)
실행 순서는 ‘드래그 앤 드롭’ 또는 우측의 값을 입력하여 조정이 가능합니다
실행 순서를 설정하고 적용(Apply) 후 게임을 실행해보았습니다.

이전의 오류는 발생하지 않고 정상적으로 작동됩니다!
3. [DefaultExecutionOrder]를 사용하는 방법
스크립트의 실행 순서는 유니티 에디터 외에 스크립트 내부에서도 설정이 가능합니다.
using UnityEngine;
// 실행 순서 설정
[DefaultExecutionOrder(-100)]
public class GameManager : MonoBehaviour
{
// 게임 점수
public int score;
// 싱글톤 인스턴스
public static GameManager instance;
private void Awake()
{
// 싱글톤 인스턴스 생성
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}GameManager스크립트 상단에 [DefaultExecutionOrder] 어트리뷰트를 사용하여 실행순서를 ‘-100’으로 설정하였습니다.
[DefaultExecutionOrder] 어트리뷰트는 유니티 에디터의 Script Execution Order를 사용하는 것과 동일한 결과를 내게됩니다.
매니저, 시스템급의 스크립트는 일반적인 스크립트보다 항상 먼저 실행이 되어야 되기에 값을 낮게 지정해주는 편입니다.



