도메인 재로드(기본적으로 활성화됨)를 수행하면 스크립팅 상태가 초기화됩니다. 또한 완전히 새로운 스크립팅 상태를 제공하며, 플레이 모드를 시작할 때마다 정적 필드와 등록된 핸들러가 전부 초기화됩니다. 즉, Unity 에디터에서 플레이 모드를 시작할 때마다 프로젝트는 빌드에서 처음 시작할 때와 매우 유사한 방식으로 플레이됩니다.
도메인 재로드에는 다소 시간이 걸리며, 그 소요 시간의 길이는 프로젝트의 스크립트 개수와 복잡도에 비례합니다. 플레이 모드를 시작하는 데 시간이 오래 걸리면 프로젝트를 빠르게 반복하기 어렵습니다. 이러한 이유로 Unity는 도메인 재로드를 비활성화할 수 있는 옵션을 제공합니다.
자세한 내용은 플레이 모드 설정 방법을 참고하십시오.
도메인 재로드를 비활성화하면 Unity가 스크립팅 상태를 매번 초기화하지 않아도 되므로 플레이 모드의 시작 속도가 빨라집니다. 하지만 플레이 모드를 시작할 때 스크립팅 상태를 직접 초기화해야 합니다. 이를 위해서는 플레이 모드 시작 시 스크립팅 상태를 초기화하는 코드를 추가해야 합니다.
도메인 재로드를 비활성하려면 다음을 수행하십시오.
참고: Enter Play 모드에서 도메인 재로드를 비활성화하면 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] 속성을 사용하여 정적 필드와 이벤트 핸들러를 초기화해야 합니다.