Version: 2019.3
설정 가능한 플레이 모드 시작
씬 재로드

도메인 재로드

도메인 재로드(기본적으로 활성화됨)를 수행하면 스크립팅 상태가 초기화됩니다. 또한 완전히 새로운 스크립팅 상태를 제공하며, 플레이 모드를 시작할 때마다 정적 필드와 등록된 핸들러가 전부 초기화됩니다. 즉 Unity 에디터에서 플레이 모드를 시작할 때마다 프로젝트는 빌드에서 처음 시작할 때와 매우 유사한 방식으로 플레이됩니다.

도메인 재로드는 완료하는 데 다소 시간이 걸리며, 이 시간은 프로젝트의 스크립트 개수와 복잡도에 비례합니다. 플레이 모드를 시작하는 데 시간이 오래 걸리면 프로젝트를 빠르게 반복하기 어렵습니다. 이러한 이유로 Unity는 도메인 재로드를 비활성화할 수 있는 옵션을 제공합니다.

도메인 재로드 비활성화

도메인 재로드를 비활성화하면 Unity가 매번 스크립팅 상태를 초기화하지 않아도 되므로 플레이 모드의 시작 속도가 빨라집니다. 하지만 플레이 모드를 시작할 때 스크립팅 상태를 직접 초기화해야 합니다. 이를 위해서는 플레이 모드 시작 시 스크립팅 상태를 초기화하는 코드를 추가해야 합니다.

도메인 재로드를 비활성화해도 자동 새로고침 설정에 따라 Unity는 스크립트를 업데이트하거나 다시 임포트할 때 스크립팅 상태를 여전히 새로 고칩니다.

도메인 재로드 비활성화 시 스크립트가 올바르게 동작하도록 수정

플레이 모드 시 스크립팅 상태가 올바르게 초기화되도록 만들려면 스크립트의 정적 필드와 정적 이벤트 핸들러를 수정해야 합니다.

정적 필드

도메인 재로드를 비활성화하면 코드의 정적 필드 값이 원래 값으로 자동으로 초기화되지 않습니다. 이런 동작을 수행하는 코드를 명시적으로 추가해야 합니다.

다음 코드 예제에는 사용자가 점프 버튼을 누를 때마다 증분하는 정적 카운터 필드가 있습니다. 도메인 재로드를 활성화하면 플레이 모드 시작 시 카운터가 자동으로 0으로 초기화됩니다. 도메인 재로드를 비활성화하면 카운터가 초기화되지 않고, 플레이 모드 시작 및 종료 시의 값을 유지합니다. 즉 에디터에서 프로젝트를 다시 실행하면 이전 실행에서 값이 변경된 경우 카운터가 0이 아닐 수 있습니다.

using UnityEngine;

public class StaticCounterExample : MonoBehaviour
{
// this counter will not reset to zero when Domain Reloading is disabled
    static int counter = 0; 

    // Update is called once per frame
    void Update()
    {
            if (Input.GetButtonDown("Jump"))
            {
                    counter++;
                    Debug.Log("Counter: " + counter);
            }
    }
}

도메인 재로드가 비활성화되었을 때에도 카운터가 초기화되도록 만들려면 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] 속성을 사용하여 값을 명시적으로 초기화해야 합니다.

using UnityEngine;

public class StaticCounterExampleFixed : MonoBehaviour
{
    static int counter = 0;

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
    static void Init()
    {
            Debug.Log("Counter reset.");
            counter = 0;   
    }

    // Update is called once per frame
    void Update()
    {
            if (Input.GetButtonDown("Jump"))
            {
                counter++;
                Debug.Log("Counter: " + counter);
            }
    }
}

정적 이벤트 핸들러

도메인 재로드를 비활성화하면 Unity는 플레이 모드 종료 시 정적 이벤트 핸들러에서 메서드를 등록 취소하지 않습니다. 따라서 정적 이벤트 핸들러에 메서드를 등록하는 코드가 있는 경우 상황이 복잡해질 수 있습니다. 예를 들어 에디터에서 프로젝트를 처음 플레이하면 메서드가 평상시처럼 등록됩니다. 하지만 프로젝트를 두 번째로 플레이하면 같은 메서드가 또 다시 등록되며, 이로 인해 이벤트 발생 시 메서드가 두 번 호출됩니다.

예를 들어 이 코드는 정적 이벤트 핸들러 Application.quitting에 메서드를 등록합니다. 도메인 재로드를 활성화하면 Unity는 플레이 모드 시작 시 이벤트 핸들러를 자동으로 초기화하므로, 메서드가 한 번만 등록됩니다. 하지만 도메인 재로드를 비활성화하면 이벤트 핸들러가 지워지지 않으므로, 에디터에서 프로젝트를 두 번째로 실행하면 같은 메서드가 다시 등록됩니다. 즉 이벤트 발생 시 메서드가 두 번 호출되는 문제가 발생합니다.

using UnityEngine;
public class StaticEventExample : MonoBehaviour
{
    void Start()
    {
            Debug.Log("Registering quit function");
            Application.quitting += Quit;
    }


    static void Quit()
    {
        Debug.Log("Quitting!");
    }
}

도메인 재로드를 비활성화하면 위 예제는 플레이 모드가 시작될 때마다 Quit 메서드를 다시 추가합니다. 이 경우 플레이 모드를 종료할 때마다 추가 “종료” 메시지가 표시됩니다.

도메인 재로드를 비활성화했을 때에도 이벤트 핸들러가 초기화되도록 만들려면 [RuntimeInitializeOnLoadMethod] 속성을 사용하여, 두 번 추가되지 않도록 메서드를 명시적으로 등록 취소해야 합니다.

using UnityEngine;
public class StaticEventExampleFixed : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod]
    static void RunOnStart()
    {
            Debug.Log("Unregistering quit function");
            Application.quitting -= Quit;
    }

    void Start()
    {
            Debug.Log("Registering quit function");
            Application.quitting += Quit;
    }

    static void Quit()
    {
        Debug.Log("Quitting the Player");
    }
}

런타임 스크립트의 경우 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] 속성을 사용하여 정적 필드와 이벤트 핸들러를 초기화해야 합니다.

정적 값을 사용하는 인스펙터나 커스텀 에디터 창과 같은 에디터 스크립트의 경우에는 [InitializeOnEnterPlayMode] 속성을 사용하여 정적 필드와 이벤트 핸들러를 초기화해야 합니다.

설정 가능한 플레이 모드 시작
씬 재로드