Scene Conflicts

 아마도 팀 작업 시, 가장 고통스러운 것 중 하나가 바로 씬(scene) 파일이 충돌났을 때입니다. 특히 해결이 쉽지 않은 경우가 너무 많기 때문에, 여러 명이 동시에 동일한 씬 파일을 작업할 때는 아주 조심스러울 수 밖에 없었습니다.  


 이렇게 해결이 어려운 씬 충돌의 대부분은 프리팹 인스턴스 내의 모든 오브젝트들이 씬 파일에 전부 추가되기 때문에 발생합니다. 즉 단순히 씬을 열기만 해도, 또는 씬 수정도 없는데 다시 씬을 저장할 때 조자도 프리팹의 모든 오브젝트 인스턴스를 씬 파일 내에 저장하였던 것입니다. 이런 이유로 같은 행위를 팀 동료들이 하는 경우에는 확실히 충돌을 만들어내게 됩니다.


 이런 형태의 충돌이 발생하면 충돌되는 내용이 id나 기타 여러 속성들인 경우가 많습니다. 문제는 이런 경우 충돌을 해결하는 방법이 명확하게 제시된 것이 없기 때문에 충돌을 해결하는 것은 매우 어렵습니다.

 근데 사실 인스턴스 안의 모든 오브젝트들에 대해서 씬 파일에 저장할 필요는 없습니다. 다만 개발을 진행해오면서 쌓여온 이유들 때문에 5 버전이 되기 전까지는 이런 방식을 그냥 둘 수 밖에 없었습니다.


 Unity 5 부터는 더 이상 모든 인스턴스 오브젝트들을 씬에 저장하지 않습니다. 단지 인스턴스의 수정내용을 포함한 프리팹 오브젝트와 씬에서 참조되는 오브젝트의 경우만 저장하게 됩니다. 이것의 차이는 여러분이 직접 확인할 수 있습니다. 

유니티 4.6 버전과 유니티 5에서 동일한 씬을 구성한 다음에 씬 파일을 열어서 두 버전을 비교해보면 됩니다. 

(좌측: Unity 4.6 에서의 씬 파일    우측: Unity 5.0에서의 씬 파일)


 따라서 앞으로는 프리팹과 관련하여 일어나는 충돌은 이제 실제 작업자가 프리팹에 대한 수정을 만들 경우에만 발생할 것입니다. 결과적으로 씬 충돌 해결 과정 더욱 단순해진 것이죠.


 두번째로 많이 발생하는 씬 충돌의 주요 원인은 팀 내에서 라이트매핑 작업을 하는 사람들 간에 생기는 문제입니다. 이 경우는 더욱 해결이 어려웠습니다. 4.6 버전에서는 라이트맵 오프셋, 스케일링 같은 라이트 맵핑 프로퍼티는 라이트맵이 포함된 각 Renderer에 저장됩니다. 이것은 결국 이러한 라이트맵 관련 프로퍼티들이 씬 파일에 저장된다는 것을 의미합니다. 두 명의 아티스트가 동일한 씬에 대해 라이트매핑을 하고 있다면, 모든 프로퍼티들은 아마도 충돌이 나게 됩니다. 결국 씬 파일 전체적으로 작은 충돌들이 퍼져 있는 형태를 만들어 냅니다. 


 유니티 5에서는 라이트맵핑에 관련된 모든 생성된 프로퍼티값들(uv오프셋, uv스케일링, 라이트맵 인덱스 등)은  별도의 에셋으로 저장됩니다. 두 사람이 씬을 수정하고 라이트맵을 베이킹한다면, 라이트 맵핑 에셋은 충돌을 일으키지만  씬 파일에서는 충돌을 만들어내지는 않기 때문에 충돌이 일어난 것에 대한 해결이 더 수월해집니다. 따라서 씬을 통해 다시 수정하거나 충돌을 해결하는 것보다는 더 시간낭비를 줄일 수 있습니다.



Scene Merging Tool

 물론 이러한 경우 말고도 여전히 씬 파일이 충돌이 일어날 수 있는 상황은 존재합니다. 나머지의 경우에는 씬 작업을 하는 아티스트에 의해 실제 값이 변경되는 경우가 대부분이며, 보통 해결하기가 단순합니다. 이런 종류의 충돌을 해결하기 용이하게 하기 위해서 유니티 개발팀에서는 씬 병합 툴(scene merginng tool)을 개발했습니다. 이 툴은 씬 파일의 시맨틱(semantic)들을 알고 있으므로 단순한 텍스트 비교가 아니라 오브젝트들에 기반한 병합(merging)이 가능합니다.

물론 이러한 병합은 텍스트 직렬화 옵션일 경우에 사용할 수 있습니다.



Tracking scene dirty scene

 이외에도 어떠한 변경이 없음에도 씬을 저장하라는 메시지를 전달받는 것도 개발자들을 매우 곤혹스럽게 만듭니다. 윈도우의 도킹 포지션의 변경이나 특정 에셋을 인스펙팅하는 행위도 씬의 dirty를 만들어 냅니다. 라이트맵을 다시 굽거나 하는 간접적인 변경 역시 씬을 dirty로 표시합니다. (모든 라이트맵핑 관련 데이터는 에셋으로 옮겨지면서 엔진이 다 씬을 저장하거나 하지 않습니다.)

 

 Unity 5에서는 씬 dirty를 잘못 바꾸는 이슈를 수정하기 위해 씬 dirty 상태의 트래킹을 undo 시스템으로 옮겼습니다. 에디터 상에서 씬과 관련해서 당신이 하는 모든 것들은 undo할 수 있습니다. 새 아이템이 undo 스택에 추가되면 UndoManager 가 그 아이템을 살펴보고 씬에 관계된 것인지 에셋에 관계된 것인지를 알게 됩니다. 만약 씬에 관계된 아이템이라면, UndoManager가 씬의 dirty 카운트를 증가시킬 것입니다. (undo를 실행하면 당연히 카운트는 낮아지겠죠.) 이렇게 dirty를 제어하면서 사용자는 수정과 undo를 통해서 정상적인 dirty 상태를 확인할 수 있습니다.



But wait, there is more

 그 밖에 여러가지 개선 사항들이 있습니다.

- Audio Clip 다중 선택 편집 가능해졌습니다.

- FBX 파일의 스케일 설정이 제대로 적용됩니다. 

- 모든 플랫폼에 대해서 유니티 에디터의 64비트 대응을 작업 중입니다. 따라서 out of memory 이슈 등에 대해서 자유로워질 수 있을 것입니다.


 이외에도 더욱 많은 유니티 워크플로우 개선사항이 있으니, 유니티 5에 대한 기대를 가져도 좋을 것입니다.


자세한 내용은 원문을 참조하여 살펴보시면 되겠습니다.

감사합니다.



Posted by 흑 기사

댓글을 달아 주세요

  1. 2015.02.27 22:25  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. blueasa 2015.10.11 13:46 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다. :)