Unity & C#

Enter Play Mode, Domain Reload와 Scene Reload

coucou3 2020. 7. 2. 23:49
반응형

 

 

 

Unity 2019.3 버전부터 'Enter Play Mode'라는 실험적 기능을 쓸 수 있다.

프로젝트가 커지다보면 Play Mode에 진입하는데 걸리는 시간이 어느 순간 확연히 늘어나기 마련이다. 

Enter Play Mode를 사용하면 이런 문제를 극단적으로 해결할 수 있다.

 

 

Unity Blog 테스트 따르면 Play Mode 진입 시간이 최소 50%에서 최대 90%까지 단축된다고 한다.

출처 : Unity Blog 더욱 빨라진 Unity 2019.3 버전 Enter Play Mode

 

 

 

사용 방법은 매우 간단하다.

Project Settings > Editor > Enter Play Mode Settings에서 'Enter Play Mode Options'를 켜주면 된다.

두 가지 옵션(Reload Domain, Reload Scene)은 아래서 설명한다.

Enter Play Mode Settings

 

 

 

 

동작 방식

Unity Editor는 Play Mode에 진입할 때 중요한 2가지 기능을 수행한다.

1) Domain Reload - 스크립트 상태를 초기화 한다

2) Scene Reload - 씬을 리로드한다.

 

이 두 기능을 수행하는데 시간이 걸리며, script와 scene이 늘어나고 복잡해질수록 진입시간은 더 늘어나게 된다.

Enter Play Mode에서 위 두 기능을 비활성화하면 아래와 같은 변화가 생긴다.

 

출처 : Unity Doc 2019.3 - Configurable Enter Play Mode

 

 

 

 

Domain Reloading과 Scene Reloading에 대해 자세히 알아보자

 

1) Domain Reloading

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

한 마디로 스크립트를 초기화하는 과정이다.

그렇기 때문에 프로젝트의 스크립트 갯수와 복잡도에 따라 리로드 시간이 증가한다.

이를 비활성화함으로써 스크립트 상태를 초기화하지 않아 Play Mode 진입 속도를 빠르게 할 수 있는 것이다.

 

다만 Domain Reload를 비활성화하게 되면 정적 필드(static field)의 값이 자동으로 초기화되지 않기 때문에 주의해야 한다.

정적 필드 값을 사용한다면 적절한 초기 시점에 수동으로 초기화시켜 주어야 한다.

 

 

정적 이벤트 핸들러 또한 마찬가지다.

Domain Reload를 비활성화하면 정적 이벤트 핸들러에 등록된 메서드가 등록 취소되지 않기 때문에 동일한 메서드가 중복하여 등록된다.

따라서 정적 이벤트 핸들러 또한 명시적으로 메서드를 등록 취소 또는 초기화해야 한다.

 

 

초기화 시점은 [RuntimeInitializeOnLoadMethod] 속성을 사용할 수 있다.

# TestClass.cs

using UnityEngine;

class TestClass
{
    [RuntimeInitializeOnLoadMethod]
    static void OnRuntimeMethodLoadFirst()
    {
    	Debug.Log("First method called after scene is loaded");
    }
    
    
    [RuntimeInitializeOnLoadMethod]
    static void OnRuntimeMethodLoadSecond()
    {
    	Debug.Log("Second method after scene is loaded");
    }
}

 

별다른 입력이나 기능없이 게임이 로드되었을 때 호출된다.

MonoBehaviour의 Awake가 호출된 다음 순서다.

[RuntimeInitializeOnLoadMethod]로 명시된 메서드들의 순서는 보장되지 않기 때문에 주의가 필요하다.

 

 

 

 

2) Scene Reload

씬 리로드는 Scene에 등장하는 기존 GameObject를 삭제하고 디스크에서 다시 로드하는 작업이다.

따라서 Scene이 복잡해질수록 시간이 오래 걸린다.

비활성화하게 되면 Scene에서 수정이 있는 GameObject만 다시 로드한다. 다만 OnEnable, OnDisable 등의 초기화 함수는 새로 로드된 것처럼 동일하게 호출된다.

 

 

 

https://blogs.unity3d.com/kr/2019/11/05/enter-play-mode-faster-in-unity-2019-3/

 

Enter Play Mode faster in Unity 2019.3더욱 빨라진 Unity 2019.3 버전 Enter Play ModeUnity 2019.3 で再生モードへの�

Play Mode(플레이 모드)를 이용하면 Unity를 더욱 다채롭게 활용할 수 있습니다. 프로젝트가 복잡해질수록 Play Mode를 시작하는 데 걸리는 시간이 길어지며, Play Mode를 빠르게 시작하고 종료할 수 있어

blogs.unity3d.com

 

반응형