글 작성자: Doublsb

지난 번에 이어서, Emotion을 저장해두고 해당 Emotion에 맞는 Sprite를 불러오기 위한 작업을 진행할 것이다.

 

- Emotion의 자료구조 : Dictionary<string, sprite>

- Emotion의 데이터 저장 형태 : 텍스트 파일

 

목표는 이와 같았는데, 변경 사항이 생겼다.

 

첫 번째로, 데이터 저장 형태가 굳이 텍스트 파일일 필요가 없었다.

Emotion의 string 데이터와 sprite 데이터 모두 메타 파일에 저장하면 되는 것이 아닌가?

오히려 텍스트 파일에 sprite를 넣으려면 경로를 저장해야 하므로 더 귀찮은 상황이 생겼다.

그래서 프리팹에 Emotion 스크립트를 넣고, 인스펙터로 값을 할당하기로 정했다.

 

두 번째로, 꼭 캐릭터마다 Emotion은 고정이어야 할까?

가령, A라는 캐릭터는 Happy가 있더라도, B라는 캐릭터는 Happy가 없을 수도 있다. 그렇다고 존재할 수 있는 모든 Emotion을 모든 캐릭터마다 넣어 놓자니 안 쓰이는 경우가 생길 수 있었다.

 

그래서, Emotion은 캐릭터 Class에 종속인 관계로 설계를 하기로 했다.

캐릭터 Class는 하위에 Emotion Class를 두게 되며, Emotion Class는 Dictionary로 이루어져 원하는 감정을 즉시 불러올 수 있게 만들 것이다.

 

오늘은 Emotion Class와 데이터 저장/불러오기, Emotion Class에서 원하는 Emotion Sprite 가져오기를 구현해 보겠다.

목표와는 관계 없는 개발 관련 잡담이 있을 수도 있는데, 어차피 1일 1커밋은 일기 같은 느낌인지라 크게 신경쓰지 않겠다.

 


#1 namespace에 관하여

예전에는 namespace의 편리함에 대해 그닥 동의하는 편이 아니었다.

그러나 부모 클래스가 같은 클래스를 여러 개 만들어보거나, 에셋을 여러가지 사용해보면서 생각이 바뀌었다.

 

한 프로젝트로부터 여러 프로덕트가 나올 수 있다면 네임스페이스가 깔끔하고 편리한 것 같다.

CodeMakerBase라는 클래스를 구현했을 때, 하위 클래스는 CodeMaker_ProductA / CodeMaker_ProductB와 같은 식이 될 것이다.

 

CodeMaker 뒤에 제품 이름을 일일이 붙여야 한다니, 그야말로 비효율적이 아닐 수 없다. 이 경우 namespace를 제품별로 구성하면 개선할 수 있었다.

실제로 위 예시보다, ProductA.CodeMaker / ProductB.CodeMaker가 더 명확하게 느껴진다.

 

에셋을 여러가지 사용해보면서, 같은 클래스 이름이 함께 사용되면 불편하다는 것도 깨달았다.

A가 만든 Outline class와 B가 만든 Outline class. 이와 같이 이름이 겹친다면 오류 더미가 한꺼번에 뜨고 고통받을 것이다. 그런 의미에서 에셋을 제작해야 한다면, namespace의 명시는 필수 사항이라고 생각한다.


#2 Dictionary 우회

 

Dictionary는 유니티 내에서 Serializeable한 구조가 아니므로 인스펙터에서 할당할 수 없다.

그래서 key 배열, value 배열 2개를 따로 만들어서 우회하기로 했다.

 

런타임에서 사용할 때에는 dictionary로 사용할 수 있게 하고, 실제 메타 데이터에는 배열의 형태로 저장되도록 했다.

혹시나 key와 value의 크기가 다를 수도 있기 때문에 예외 처리도 해 줬다.

 

이렇게 하면 Emotion.Data로 원하는 Sprite에 접근할 수 있게 된다.

 

해당 커밋 보러가기


#3 삽질

 

만들고 보니, 이 클래스는 Emotion 클래스가 아니라 그냥 Serialize 가능한 Dictionary였다.

그렇다. 이럴거면 그냥 Serialize 가능한 Generic Dictionary를 만들어 놓고, 몇번이든 우려먹으면서 쓰면 괜찮지 않겠냐는 생각이 들었던 것이다.

 

하지만 구현 후, Generic은 Serialize 불가능하다는 결론만 얻고 돌아왔다. 아쉬워라.

 

https://wiki.unity3d.com/index.php/SerializableDictionary

 

SerializableDictionary - Unify Community Wiki

Author: Fredrik Ludvigsen (Steinbitglis) Description This script lets you use serializable dictionaries in Unity with little boilerplate per new type. You can also choose if you want to add a property drawer for the type very easily. The property drawer is

wiki.unity3d.com

그런데 누가 실제로 구현해놨다. 이건 아예 Serialize 가능한 Type마다 클래스로 만들어서 할당하여 사용하고 있었다. 세상에...

 

어차피 Type마다 개별 Class를 만드는 구조이므로, 링크의 스크립트는 가져오지 않고 내가 만든 것으로 진행하겠다.


# 4

 

 

이렇게 해서 Emotion Class를 구현하였다.

하지만 이대로는 보기가 편하지 않으므로, 내일은 커스텀 에디터를 이용하여 <key, value>를 쉽게 확인하고 수정할 수 있게끔 작성해 보겠다.

 

해당 커밋 보러가기

반응형