근래에 유니티로 작성된 여러 프로젝트들을 볼 기회가 있었다. 그러나 많은 프로젝트들이 유니티를 사용하면서도 유니티의 강점을 이용하지 않고 있었다.


구현 관점에서 봤을 때 필자가 생각하는 유니티의 강점은 에디터의 활용이 아주 쉽다는 것이다. Component 계열 클래스를 상속하면 자신의 클래스를 인스펙터로 노출시킬 수 있다. 그리고 Editor 혹은 EditorWindow 클래스를 상속하면 유니티 에디터 자체를 수정하거나 확장할 수도 있다. 이를 통해 에디터에서 게임 데이터를 편집하고 상태를 확인할 수 있다. 이는 생산성에 큰 도움을 준다.


그러나 몇몇 프로젝트들은 여러 이유 - 예로 특정 엔진에 너무 종속적인 코드는 좋지 않다 - 로 에디터를 적극적으로 활용하지 않고 있었다. 간단한 데이터 수정도 외부 툴을 이용하여 수정한 다음 게임을 재시작해서 테스트해야 했고, 게임 상태 확인을 위해 잦은 디버깅을 필요로 했다. 이는 마치 별도의 에디터 없이 Visual Studio 같은 IDE 를 이용해서 개발하던 때와 같았다. 유니티 에디터와 연동되는 기능을 최대한 줄이는 쪽으로 진행되는 극단적인 프로젝트도 있었다.


위에서 예로 든 '특정 엔진에 너무 종속적인 코드는 좋지 않다' 에 대해서는 되물어보고 싶다. 종속적이라는게 과연 어떤 의미인가? 유니티에서 작성한 코드들을 언리얼에서 사용할 작정인가? 다른 프로젝트에서는 더 이상 유니티로 개발하지 않는 것인가?


게임은 수많은 데이터와 상태가 복잡하게 뒤엉켜 있는 프로그램이다. 따라서 주어진 환경에서 이러한 데이터, 상태들을 쉽게 확인하고 수정할 수 있게 하는 것이 무엇보다 중요하다. 그렇게 하면 생산성은 극대화 하면서 개발 비용을 크게 낮출 수 있다. 유니티는 이를 손쉽게 가능하게 해주므로 적극 활용하는 것이 좋다.

'유니티 - 이것저것' 카테고리의 다른 글

에셋번들 기초  (0) 2016.02.04
에셋 기초  (0) 2016.02.01
Invoke 와 Coroutine 주의사항  (0) 2016.01.23
Frustum Testing  (0) 2016.01.09
안드로이드에서 수동으로 프로파일러 Attach 하기  (0) 2016.01.08
Posted by 카코데몬
,

지난번 포스트에서 에셋에 관해 간단히 살펴봤다.


에셋번들의 아이디어는 동적으로 로드되는 에셋에서 출발한다. 에셋에 대해 설명할 때, 에셋을 Resources 폴더 하위에 위치시키면 씬 혹은 다른 에셋에 의해 참조되지 않더라도 빌드에 포함되어 스크립트로 동적 로드가 가능하다는 것을 언급했었다.


에셋번들은 이렇게 동적으로 로드될 에셋들을 별도의 파일로 분리하여 빌드에는 포함하지 않으나 웹을 이용한 다운로드 등의 방법을 통해 파일을 읽어들여 로드하게 된다. 이는 다음의 두 가지 특징을 가지게 된다.

  1. 빌드 크기가 줄어든다.
  2. 빌드 후에 재빌드 없이 리소스만 변경, 즉 리소스 패치가 가능해진다
특히 리소스 패치는 에셋번들에서 가장 중요한 특징이다. 앱을 빌드하는 프로세스가 바뀌기 때문인데 다음 상황을 비교해보자.

에셋번들을 사용하지 않았을 때
스크립트가 변경되었다 => 앱을 빌드한다
리소스만 변경되었다 => 앱을 빌드한다

에셋번들을 사용했을 때
스크립트가 변경되었다 => 앱을 빌드한다
리소스만 변경되었다 => 바뀐 리소스를 참조하고 있는 에셋번들만 빌드한다


이렇게 앱 빌드에 추가로 에셋번들 빌드 프로세스가 추가되면서 앱의 빌드 주기가 "바이너리 패치" 와 "리소스 패치" 로 나뉠 수 있게 된다. 어느 정도 규모가 있는 프로젝트인 경우 이와 같이 에셋번들을 이용해서 리소스 패치를 행하고 있다.

Posted by 카코데몬
,

유니티에서 텍스처, 애니메이션, 재질, 프리팹 등을 에셋이라 부르고 Assets 폴더에서 이런 에셋들을 관리하게 된다.


에셋은 기본적으로 씬 혹은 다른 에셋으로부터 '참조' 에 의해 사용된다. 다음 그림을 보자.



이미지 하나를 씬에 배치하고 나무 텍스처를 입혔다. 즉 현재 씬에 있는 이미지 객체가 나무 텍스처 에셋을 '참조' 하게 된 것이다.


참조는 유니티에서 매우 중요한데 다음 두 가지 특징을 살펴보자.

  1. 참조는 내부적으로 에셋에 할당된 고유 ID 로 판별한다. 따라서 에셋의 경로는 무의미하다. 실제로 에셋의 경로를 옮기더라도 참조는 여전히 유지되는 것을 확인할 수 있다
  2. 특수한 경우를 제외하고 씬 혹은 다른 에셋에 의해 참조되지 않은 에셋은 빌드에 포함되지 않는다

유니티는 Assets 내부에 새로운 에셋 파일이 추가되면 이와 1:1 대응하는 meta 파일을 같은 경로에 만들고 여기에 에셋의 고유 ID 를 기록한다. 이 고유 ID 는 경로와는 무관하며 한번 정해지면 바뀌지 않는다. 이제 다른 씬 혹은 에셋에 의해 참조될 때 이 고유 ID 를 가리키게 함으로써 종속성을 만든다.


유니티에서는 빌드시에 Assets 폴더를 통째로 빌드에 포함시키지 않고 참조에 의해 실제 사용되는 에셋들만을 포함시킨다. 예를 들어 A, B, C 씬을 빌드한다고 해보자. 그럼 A, B, C 씬에서 참조하는 에셋들, 그리고 다시 그 에셋들이 참조하는 다른 에셋들, 이런 식으로 모든 참조를 찾아서 해당 에셋들만을 빌드에 포함하게 된다.


단, 위에서도 언급했듯 특수한 경우에는 참조가 없더라도 포함시키는데 Resources 라는 이름의 폴더 하위에 있는 에셋들이 그 대상이다. 스크립트로 동적으로 로드되는 에셋들은 실행 중에 참조가 되기 때문에 빌드시에는 참조가 없다. 따라서 이런 에셋들은 Resources 하위에 두고 다음과 같은 코드를 이용하여 동적 로드한다.


Resources.Load("경로");


Resources 폴더 외에 다른 특수한 폴더들도 존재하므로 유니티 공식 문서를 확인토록 하자.

Posted by 카코데몬
,