Version: 2017.1
UI 프로파일러
런타임 시 리소스 로드

다중 씬 편집(Multi Scene Editing)

다중 씬 편집을 사용하면 에디터에서 한 번에 여러 씬을 열 수 있으며 런타임 시 더욱 간편하게 씬을 관리할 수 있습니다.

에디터에서 여러 씬을 열면 대규모 스트리밍 월드를 생성할 수 있으며 공동으로 씬을 편집할 때 워크플로가 개선됩니다.

이 페이지는 다음 항목을 설명합니다.

  • 에디터에서 다중 씬 편집 통합
  • 에디터 스크립팅 및 런타임 스크립팅 API
  • 현재 알려진 문제

에디터에서

새 씬을 열어서 계층의 현재 씬 리스트에 추가하려면 씬 에셋의 컨텍스트 메뉴에서 씬 애디티브 열기를 선택하거나 프로젝트 창에서 하나 이상의 씬을 계층 구조 창으로 드래그하는 방법을 쓸 수 있습니다.

씬 애디티브 열기는 선택된 씬 에셋을 계층 구조가 보이는 현재 씬에 추가합니다
씬 애디티브 열기는 선택된 씬 에셋을 계층 구조가 보이는 현재 씬에 추가합니다

에디터에 여러 씬을 열어놓으면 각 씬의 콘텐츠가 계층 창에 개별적으로 나타납니다. 각 씬의 콘텐츠는 씬의 이름과 저장 상태를 보여주는 씬 디바이더 바 아래에 표시됩니다.

여러 씬이 동시에 열려 있음을 보여주는 계층 창
여러 씬이 동시에 열려 있음을 보여주는 계층 창

씬은 계층에서 로드되거나 언로드되어 각 씬에 포함된 게임 오브젝트를 나타내거나 숨길 수 있습니다. 계층 창에서 이를 추가제거하는 것과는 다릅니다.

씬 디바이더는 많은 씬이 로드되어 있을 경우 계층 구조 탐색에 도움을 주는 씬 콘텐츠로 숨길 수 있습니다.

여러 씬을 작업할 때 수정된 각 씬의 변경사항은 추후에 저장되어야 하므로 저장되지 않은 여러 씬이 동시에 열려있는 상황이 발생할 수 있습니다. 저장되지 않은 변경사항이 있는 씬은 씬 디바이더 바에서 이름 옆에 별표가 뜹니다.

씬 디바이더의 별표는 해당 씬에 저장되지 않은 변경사항이 있음을 나타냅니다.
씬 디바이더의 별표는 해당 씬에 저장되지 않은 변경사항이 있음을 나타냅니다.

각 씬은 디바이더 바의 컨텍스트 메뉴를 통해 개별적으로 저장될 수 있습니다. 파일 메뉴에서 “씬 저장”을 선택하거나 Ctrl/Cmd + S를 누르면 열려 있는 모든 씬의 변경사항이 저장됩니다.

씬 디바이더 바의 컨텍스트 메뉴로 선택된 씬의 기타 동작을 수행할 수도 있습니다.

로드된 씬의 씬 디바이더 메뉴

Set Active Scene This allows you to specify which scene new Game Objects are created/instantiated in. There must always be one scene marked as the active scene
Save Scene Saves the changes to the selected scene only.
Save Scene As Saves the selected scene (along with any current modifications) as a new Scene asset.
Save All Saves changes to all scenes.
Unload Scene Unloads the scene, but keeps the scene in the Hierarchy window.
Remove Scene Unloads and removes the scene from the Hierarchy window.
Select Scene Asset Selects the scene’s asset in the Project window.
GameObject Provides a sub-menu allowing you to create GameObjects in the selected scene. The menu mirrors the creatable items available in Unity’s main GameObject menu. (shown below)
씬 디바이더 바 메뉴의 게임 오브젝트 서브 메뉴
씬 디바이더 바 메뉴의 게임 오브젝트 서브 메뉴

언로드된 씬의 씬 디바이더 메뉴

Load Scene Loads the scene’s contents
Remove Scene Remove the scene from the Hierarchy window.
Select Scene Asset Selects the scene’s asset in the Project window.

여러 씬에서 라이트맵(Lightmaps) 베이킹

여러 씬의 Lightmap data를 한 번에 베이크하려면 베이크할 씬을 열고 라이팅 창에서 “자동” 모드를 해제한 후 조명을 빌드하기 위해 빌드 버튼을 클릭합니다.

조명 산출의 입력은 모든 씬에서의 정적 지오메트리와 광원입니다. 따라서 섀도우와 GI 광원 바운스는 모든 씬에서 작동합니다. 하지만 라이트맵과 리얼타임 GI 데이터는 각 씬마다 개별적으로 로드/언로드되는 데이터로 분리됩니다. 라이트맵과 리얼타임 GI 데이터 아틀라스는 씬별로 나뉩니다. 이는 씬별 라이트맵이 공유되지 않으며 씬을 언로딩할 때 안전하게 언로드될 수 있음을 의미합니다. 현재 라이트 프로브 데이터는 언제나 공유되며 함께 베이크된 모든 씬에서 라이트 프로브 전체가 동시에 로드됩니다.

아니면 에디터 스크립트의 Lightmapping.BakeMultipleScenes 함수로 여러 씬에서 라이트맵 빌딩을 자동화할 수 있습니다.

여러 씬에서 내비메시(Navmesh) 데이터 베이킹

여러 씬에서 한 번에 Navmesh data를 만들려면 베이크할 씬을 열고 내비게이션 창에서 베이크 버튼을 클릭합니다. 내비메시 데이터는 하나의 에셋으로 베이크되며 로드된 모든 씬에서 공유됩니다. 데이터는 현재 사용 중인 씬의 이름과 일치하는 폴더에 저장됩니다(예를 들어, ActiveSceneName/NavMesh.asset). 로드된 모든 씬은 내비메시 에셋을 공유합니다. 내비메시를 베이크한 후 영향을 받은 씬은 씬에서 내비메시로 참조가 유지되도록 저장해야 합니다.

아니면 에디터 스크립트의 NavMeshBuilder.BuildNavMeshForMultipleScenes 함수로 여러 씬에서 내비메시 데이터 빌딩을 자동화할 수 있습니다.

플레이모드(Playmode)

플레이모드에서 여러 씬이 계층 구조에 있는 상태로 DontDestroyOnLoad라는 추가 씬이 나타납니다.

Unity 5.3 이전에는 “DontDestroyOnLoad”로 표시된 플레이모드에서 인스턴스화하는 모든 오브젝트가 여전히 계층 구조에 표시되어 있습니다. 이러한 오브젝트는 특정 씬의 일부로 간주되진 않지만 Unity가 계속 오브젝트를 보여주고 사용자가 확인할 수 있도록 이제는 DontDestroyOnLoad 씬의 일부로 나타납니다.

DontDestroyOnLoad 씬에 액세스할 필요는 없으며 런타임 시에는 가능하지 않습니다.

씬별 설정

일부 설정은 각 씬에 지정되며, 예시는 다음과 같습니다.

  • RenderSettings 및 LightmapSettings(둘 다 라이팅 창에 있음)
  • 내비메시 설정
  • 오클루전 컬링 창의 씬 설정

각 씬은 자체 설정을 관리하고 해당 씬에 관련된 설정만 씬 파일에 저장되는 방식으로 작동합니다.

여러 씬이 열려 있으면 렌더링과 내비메시에 사용되는 설정은 active scene의 설정입니다. 씬의 설정을 변경하려는 경우 하나의 씬만 열어서 설정을 바꾸거나 해당 씬을 액티브 씬으로 만들어 설정을 변경해야 합니다.

에디터 또는 런타임 시점에 액티브 씬을 전환하면 새로운 씬의 모든 설정이 적용되며 이전 설정을 모두 대신합니다.

스크립팅

에디터 스크립팅(Editor Scripting)

에디터 스크립팅용으로 Scene structEditorSceneManager API, SceneSetup 유틸리티 클래스를 제공합니다.

Scene struct는 에디터와 런타임 모두에서 가능하며 씬 자체에 관련된 이름, 에셋 경로 등 읽기 전용의 프로퍼티 일부를 포함합니다.

EditorSceneManager class는 에디터에서만 가능합니다. SceneManager에서 유래되며 에디터 스크립팅을 통해 위에 설명한 모든 다중 씬 편집 기능을 구현할 수 있는 함수를 보유합니다.

SceneSetup class는 현재 계층 구조에 있는 씬에 대한 정보를 저장하는 소규모 유틸리티 클래스입니다.

UndoPrefabUtility 클래스는 여러 씬을 지원하도록 확장됐습니다. 이제는 주어진 씬에서 프리팹을 [PrefabUtility.InstantiatePrefab]으로 인스턴스화할 수 있습니다. 또한 (Undo.MoveGameObjectToScene)[ScriptRef:Undo.MoveGameObjectToScene]를 활용해 실행 취소 가능한 방식으로 오브젝트를 씬의 루트로 옮길 수 있습니다.

참고: Undo.MoveGameObjectToScene를 사용하려면 게임 오브젝트가 이미 현재의 씬 루트에 위치하는지를 확인해야 합니다.

런타임 스크립팅(Runtime Scripting)

런타임 시점의 스크립팅과 관련하여 LoadSceneUnloadScene처럼 여러 씬에 작동하는 함수는 SceneManager 클래스에서 볼 수 있습니다.

참고

파일 메뉴에서 다른 이름으로 저장은 액티브 씬만 저장합니다. 씬 저장은 제목 없는 씬이 있다면 이름을 지정하는 작업을 포함하여 수정된 모든 씬을 저장합니다.

프로젝트 창의 생성 메뉴에서 새로운 씬 에셋 만들기
프로젝트 창의 생성 메뉴에서 새로운 씬 에셋 만들기

팁과 요령

씬을 계층 구조에 추가하는 한편 드래그할 때 Alt 키를 눌러 언로드된 상태를 유지할 수 있습니다. 이러한 경우 나중에 원할 경우 씬을 로딩할 수 있는 옵션이 주어집니다.

새 씬은 프로젝트 창의 생성 메뉴에서 생성됩니다. 새 씬은 게임 오브젝트의 디폴트 설정을 포함합니다.

Unity를 새로 시작할 때마다 계층 구조를 설정해야 하는 상황을 피하거나 서로 다른 설정을 손쉽게 저장할 수 있도록 EditorSceneManager.GetSceneManagerSetup을 활용하여 현재 설정을 기술하는 SceneSetup 오브젝트 리스트를 얻을 수 있습니다. 그리고 이를 씬 설정에 저장할 기타 정보와 더불어 ScriptableObject 등으로 직렬화할 수 있습니다. 계층을 복원하려면 SceneSetups 리스트를 다시 생성하고 EditorSceneManager.RestoreSceneManagerSetup를 활용하십시오.

런타임 동안 로드된 씬의 리스트를 얻으려면 sceneCount를 받은 후 GetSceneAt를 씬에 반복적으로 적용합니다.

게임 오브젝트가 속한 씬을 GameObject.scene으로 얻을 수 있으며 SceneManager.MoveGameObjectToScene을 활용해 게임 오브젝트를 씬의 루트로 옮길 수 있습니다.

씬에서 남겨두기 원하는 게임 오브젝트를 지속적으로 관리하는 데 DontDestroyOnLoad를 사용하는 것은 권장하지 않습니다. 대신 모든 매니저가 있는 manager scene을 생성하고 게임 프로세스를 관리할 때 SceneManager.LoadScene(<path>, LoadSceneMode.Additive)SceneManager.UnloadScene을 활용하십시오.

알려진 사항

  • 크로스씬 레퍼런스는 지원되지 않지만 사용할 수 없는 것은 아닙니다. 씬을 저장할 수 없으므로 편집 모드에서는 크로스씬 레퍼런스를 사용할 수 있습니다.
  • Umbra의 오클루전 컬링 데이터는 추가로 로드되지 않습니다.
UI 프로파일러
런타임 시 리소스 로드