Unity/정보

[Unity] Script Execution Order 설정 (스크립트별 실행 순서 설정)

달시_Dalsi 2025. 3. 12. 20:59
728x90

Unity에서 여러 스크립트가 실행될 때 Awake(), OnEnable(), Start() 등의 초기화 함수가 실행되는 순서는 중요합니다. 특히 Awake()가 OnEnable()보다 항상 먼저 실행된다고 보장되지 않는 경우가 있어 예상치 못한 Null 참조 오류가 발생할 수도 있습니다.

이번 글에서는 Script Execution Order(스크립트 실행 순서)를 설정하여 이러한 문제를 해결하는 방법을 알아보겠습니다.


1. Unity의 기본 실행 순서

Unity는 게임 오브젝트가 활성화될 때 특정 순서대로 메서드를 호출합니다.

  1. Awake()
  2. OnEnable()
  3. Start()
  4. 기타 업데이트 관련 메서드 (Update, FixedUpdate 등)

보통 Awake()에서 객체의 참조를 설정하고, OnEnable()에서는 해당 객체를 사용할 준비를 합니다. 그러나 실행 순서가 정확히 보장되지 않는 경우에는 OnEnable()에서 참조하려는 객체가 아직 초기화되지 않아 Null 오류가 발생할 수 있습니다.

유니티 공식 문서

 


2. Script Execution Order 설정하기

Unity에서는 특정 스크립트의 실행 순서를 조정할 수 있도록 Script Execution Order 설정을 제공합니다.

 

실행 순서 설정 방법

  1. Edit > Project Settings > Script Execution Order를 클릭합니다.
  2. 실행 순서를 변경할 스크립트를 추가합니다.
  3. 우선 실행되어야 하는 스크립트를 위쪽으로 배치합니다.
  4. 적용 후 Unity를 다시 실행하면 설정된 순서대로 스크립트가 실행됩니다.

 

예제: GameManager의 Awake()가 먼저 실행되도록 설정

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    private void Awake()
    {
        Instance = this;
        Debug.Log("GameManager Awake");
    }
}
public class PlayerController : MonoBehaviour
{
    private void OnEnable()
    {
        Debug.Log(GameManager.Instance != null ? "GameManager is ready" : "GameManager is NULL");
    }
}

 

문제 발생: PlayerController의 OnEnable()이 GameManager의 Awake()보다 먼저 실행되면 GameManager.Instance가 아직 설정되지 않아 NULL이 발생할 수 있습니다.

 

해결 방법: Script Execution Order에서 GameManager를 PlayerController보다 먼저 실행되도록 설정합니다.


3. 정리

  • 프로젝트 상황에 따라서 Awake()와 OnEnable()의 실행 순서는 항상 보장되지 않습니다.
  • 중요한 초기화 로직이 있다면 Script Execution Order를 조정하여 순서를 명확하게 설정해야 합니다.
  • Edit > Project Settings > Script Execution Order에서 원하는 스크립트의 우선순위를 조정할 수 있습니다.
728x90