모티브


 

Unity 3D 는 다수 개의 게임 인스턴스를 용납하지 않기 때문에 시뮬레이션이 필요한 에디팅을 할 때는 정말 짜증나는 경우가 많다. 예를 들어 캐릭터 애니메이션 에디터를 만든다고 하자.

 

보통의 상용 엔진이라고 하면 새로운 씬이나 게임 인스턴스를 생성하도록 한다. 예를 들어 UE4 같은 경우에는 editor game instance, play-in-editor( pie ) game instance, 일반적인 game instance 들이 따로 존재할 수 있는 구조이다. 그리고 각 게임 인스턴스들의 입력, 씬 구성 등은 모두 다르다. 그러므로 에디터 메인 뷰를 띄워 놓은 상태에서 페르소나 애니메이션 툴을 따로 띄워 놓고 내부적으로 시뮬레이션을 수행할 수 있다.

 

그러나 유니티는 그런거 절대 없다. 시뮬레이션이 필요하다면 반드시 플레이 버튼을 눌러야 하며 씬도 한 번에 하나밖에 못 띄운다( 콜백을 받아서 편집 상태에서 시뮬레이션하는 방법이 있다고 하는데, 아직까지 해 본 적이 없어서 잘 모르겠다 ). 일단 게임 인스턴스라는 개념조차 없는 것 같으니 대충 비슷하게라도 처리할 수 있는 방법을 찾고 있었다. 그러던 차에 5.3.X 버전부터 멀티 씬 편집을 지원한다는 사실을 알게 되었다( 유니티도 UE 와 같이 스트리밍을 하고 싶었나보다 ).

 

유니티는 현재 시점에는 한글 도움말에는 이것에 대한 정보 자체를 공개하지 않고 있다. 하지만 영문 도움말에는 나와 있다. 이상하게 영문 도움말과 한글 도움말의 카테고리 구성조차 다르다. 뭐하자는 건지 잘 모르겠다. 어쨌든 이 멀티 씬 개념을 사용하면 적어도 오브젝트 관리라도 따로 할 수 있지 않을까라는 생각이 들어서 정확하게 어떤 개념인지 알아 보기로 했다. 목표는 아래와 같다.

 

1. 에디터에서 원하는 시점에 다중 씬을 구성할 수 있는지 확인.

2. 특정 씬의 개체를 획득할 수 있는지 확인.

3. 특정 씬을 편집할 수 없도록 잠글 수 있는지 확인.

4. 특정 윈도우를 띄웠을 때 원하는 뷰에서 특정씬만을 볼 수 있는지 확인.

5. 특정 씬만 플레이할 수 있는지 확인.

 

씬 구성


 

테스트 프로젝트를 하나 만들어서 "Main" 과 "Customizer" 라는 씬을 만들었다. Main 에는 카메라와 빈 게임 오브젝트가 들어 있고, Customizer 에는 도형들이 들어 가 있다. 서로 위치가 겹치지 않게 하기 위해서 ( 원하는 뷰가 나오는지 확인하기 위해서 ), 조금 다른 위치에 배치했다.

 

툴의 "Open Scene Additively" 메뉴를 사용해서 화면을 열면 다음과 같은 결과를 얻을 수 있다.

 

 

두 개의 씬이 올라 와 있고 서로 다른 계층 구조를 가지고 있는 것을 확인할 수 있다. 현재는 Main 씬이 활성화되어 있다.

 

새 윈도우에 씬 렌더링하기


 

위와 동일한 결과를 획득하면서 새로운 윈도우에 Customizer 씬을 렌더링하는 테스트를 수행했다. 이를 위해서 Customizer 라는 EditorWindow 를 제작했다. 주석을 열심히 달아 놓았으니 의미를 파악하기는 어렵지 않을 것이라 본다.

 

 

이렇게 했을 때 다음과 같은 결과를 얻을 수 있었다. Customizer 씬이 활성화되어 있는 것을 볼 수 있다. 씬이 활성화되어 있다는 의미는 다음과 같다. 새로운 게임 오브젝트들은 기본적으로 활성화된 씬에 포함된다.

 

 

 

즉 활성화 여부만으로는 편집을 막거나 렌더링을 막을 수 없다. 실제로 위의 상태에서 메인씬에 3D 텍스트를 추가해 보았다. 다음과 같은 결과를 얻을 수 있었다.

 

 

결론


 

위의 테스트를 통해서 다음과 같은 결론을 얻을 수 있었다.

 

1. 에디터에서 원하는 시점에 다중 씬을 구성할 수 있는지 확인 : 원하는 시점에 다중 씬을 구성할 수 있다.

 

2. 특정 씬의 개체를 획득할 수 있는지 확인 : 현재( 5.3.1f ) 특정 씬의 개체를 획득할 수 인터페이스는 없었다Workaround 가 있다GameObject 가 scene 이라는 멤버 필드를 가지고 있으므로, 모든 게임 오브젝트에 대해 루프를 돌면서 확인할 수는 있다. 5.3.2 버전 부터는 Scene.GetRootGameObjects() 라는 메서드를 지원한다고 하니 그것을 이용할 수도 있다.

 

3. 씬을 편집할 수 없도록 잠글 수 있는지 확인 : 잠글 수 없다. Workaround 가 있다. 만약 모달 윈도우를 띄울 수 있다면 비슷하게 할 수는 있을 것 같다. 그러면 추가/삭제가 활성화된 씬에서 이루어질 것이기 때문읻. 유니티에서 모달 시스템 구현을 하는 방법에 대한 아티클들이 있으니 참고해 볼 수 있을 것 같다.

 

4. 특정 윈도우를 띄웠을 때 원하는 뷰에서 특정씬만을 볼 수 있는지 확인 : 원하는 뷰에서 볼 수는 있지만 특정 씬만을 볼 수는 없다. Workaround 가 있다. 이쪽은 아직 자세하게 몰라서 그런데, tag 나 layer 같은 것을 써서 렌더링 요소를 filtering 할 수 있다고 들은 것 같다. 막 나갈라면 그냥 모든 요소 돌면서 Customizer 씬의 요소가 아니면 렌더링을 꺼 버리는 수가 있다. 물론 복구를 잘 해야 하지만...

 

5. 특정 씬만 플레이할 수 있는지 확인 : 이것은 4 번 항목과 유사한 문제라 할 수 있다.

 

결과적으로 볼 때, ( 설계를 매우 잘 해야 하겠지만 ) 여러 가지 꼼수들을 사용하면 다중 게임 인터페이스가 있는 것과 유사한 행동을 하도록 구성할 수는 있을 것 같다.

 

참고로 버그를 하나 발견했는데, Customizer 윈도우를 띄우고 나서 플레이를 누른다음에 창을 닫으면 Customizer 씬이 없어지지 않는다. 아마도 플레이 동작에서 씬에 대한 레퍼런스를 하나 들고 있는 것이 아닌가 싶다.

+ Recent posts