유니티 스크립트 실행 순서 변경 방법 [유니티 C#]

스크립트 실행 순서를 설정하는 2가지 방법

개발을 진행하다 보면 스크립트의 실행 순서를 지정해야 될 순간이 오게 됩니다.

오늘은 스크립트의 실행 순서를 제어하는 2가지 방법에 대해서 살펴보겠습니다!

  • 에디터 내 ‘Script Execution Order’를 사용하는 방법
  • [DefaultExecutionOrder] 어트리뷰트를 사용하는 방법

1. 왜 필요할까?

지난번에 구현했던 싱글톤 패턴에서 스크립트의 실행 순서를 설정해야 되는 대표적인 상황이 있습니다.

C#
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);
        }
    }
}
C#
using UnityEngine;

public class ScoreDisplay : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log($"현재 점수 : {GameManager.instance.score}");
    }
}

GameManagerAwake 함수에서 싱글톤 인스턴스를 생성합니다.
그리고 ScoreDisplay 스크립트에서도 Awake 함수에서 GameManager의 인스턴스에 접근하여 score 변수를 가져오는 간단한 코드를 작성해보았습니다.

실제로 코드를 실행시켜보면 어떻게 될까요?


접근하는 대상이 NULL일 때 발생하는 ‘NullReferenceException’ 에러가 발생할 수 있습니다.

에러 로그를 읽어보면 ScoreDisplay스크립트의 7번째 줄
Debug.Log($”현재 점수 : {GameManager.instance.score}”);
부분에서 에러가 발생합니다.

위 경우에서 에러가 발생한 이유는 GameManager에서 싱글톤 인스턴스를 생성하기 전ScoreDisplay스크립트가 실행되었기 때문입니다.

이처럼 AwakeStart 같은 동일한 생명주기 함수 내에서는, 누가 먼저 실행될지 보장할 수 없습니다.
따라서 명시적으로 순서를 정해주지 않으면 NullReferenceException같은 에러를 마주하게 됩니다.


2. Script Execution Order를 사용하는 방법

유니티 에디터에서는 [Script Execution Order] 기능을 통해 스크립트의 실행 순서를 직관적으로 제어할 수 있습니다.

[Edit] [Project Settings][Script Execution Order]

우측 하단 ‘+’ 버튼을 통해 실행 순서를 제어 할 스크립트를 추가할 수 있습니다.

스크립트명 우측의 값이 낮을수록 먼저 실행되게 됩니다.

이전의 문제를 해결하기 위해 GameManager가 ScoreDisplay보다 먼저 실행되도록 조정했습니다.

실행 순서를 조정하지 않은 스크립트들은 [DefaultTime] 슬롯에서 실행됩니다.
DefaultTime 슬롯은 음수 순서 번호가 있는 스크립트 다음에, 그리고 양수 순서 번호가 있는 스크립트 이전에 실행됩니다.
(위 경우에서는 -1 다음 10 이전에 실행됩니다.)

실행 순서는 ‘드래그 앤 드롭’ 또는 우측의 을 입력하여 조정이 가능합니다

실행 순서를 설정하고 적용(Apply) 후 게임을 실행해보았습니다.

이전의 오류는 발생하지 않고 정상적으로 작동됩니다!


3. [DefaultExecutionOrder]를 사용하는 방법

스크립트의 실행 순서는 유니티 에디터 외에 스크립트 내부에서도 설정이 가능합니다.

C#
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를 사용하는 것과 동일한 결과를 내게됩니다.

매니저, 시스템급의 스크립트는 일반적인 스크립트보다 항상 먼저 실행이 되어야 되기에 값을 낮게 지정해주는 편입니다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다