기본적으로 씬 재로드는 활성화됩니다. 즉 플레이 모드를 시작하면 Unity는 모든 기존 씬 게임 오브젝트를 삭제하고 디스크에서 씬을 다시 로드합니다. Unity가 이 작업을 완료하는 데 걸리는 시간은 씬의 복잡도에 비례합니다. 프로젝트가 복잡해지면 플레이 버튼을 누른 후 씬에 에디터에 완전히 로드될 때까지 걸리는 시간이 길어집니다.
씬 재로드를 비활성화하면 프로세스 시간이 단축됩니다. 이렇게 하면 프로젝트 개발을 더욱 빠르게 반복할 수 있습니다. Unity는 디스크에서 씬을 다시 로드하는 대신, 씬의 수정된 콘텐츠만 초기화합니다. 따라서 씬의 언로드와 재로드가 시간과 성능에 영향을 미치지 않습니다. Unity는 새로 로드된 것처럼 여전히 동일한 초기화 함수(예: OnEnable
, OnDisable
, OnDestroy
)를 호출합니다.
씬 재로드를 비활성화하면 에디터에서 애플리케이션을 시작하는 데 걸리는 시간이 더 이상 빌드된 버전의 시작 시간을 나타내지 않습니다. 따라서 프로젝트를 시작하는 동안 정확히 어떤 일이 발생하는지 디버깅하거나 프로파일링하려면 씬 재로드를 활성화하여 애플리케이션의 빌드된 버전에서 발생하는 실제 로드 시간과 프로세스를 더 정확하게 나타내야 합니다.
씬 재로드를 비활성화하면 프로젝트에 대한 부작용이 최소화됩니다. 하지만 씬 재로드는 도메인 재로드와 밀접한 관련이 있기 때문에 다음과 같은 몇 가지 주요 차이점이 있습니다.
빌드로 직렬화되지 않은 ScriptableObject 및 MonoBehaviour 필드([NonSerialized]
, 프라이빗 또는 내부)는 해당 값을 유지합니다. 이는 Unity가 기존 오브젝트를 다시 생성하지 않고 생성자를 호출하지 않기 때문입니다. 또한 Unity는 도메인 재로드 동안 배열/리스트 타입의 null 프라이빗 및 내부 필드를 빈 배열/리스트 오브젝트로 전환하고, 런타임(비 에디터) 스크립트에 대해 null이 아닌 상태를 유지합니다.
ExecuteInEditMode
또는 ExecuteAlways
스크립트를 사용하는 스크립트는 OnDestroy
또는 Awake
호출을 수신합니다. Unity는 Awake를 호출하지 않으며, EditorApplication.isPlaying
프로퍼티를 확인하는 Awake/OnEnable 메서드로 플레이 모드를 변경 시 EditorApplication.isPlaying
이 이미 true인 경우에만 OnEnable을 호출합니다. 런타임(비 에디터) 스크립트에 대한 직렬화되지 않은 필드는 편집 모드에서 활성화되지 않으므로 문제가 되지 않습니다. 하지만 ExecuteInEditMode
또는 ExecuteAlways
로 표시된 스크립트는 자체적으로 변경되거나 다른 런타임 스크립트의 필드를 터치할 수 있습니다. 이 문제를 해결하려면 OnEnable 콜백에서 영향을 받는 모든 필드를 직접 초기화하십시오.