관리 메뉴

도드넷

유니티 C# 딕셔너리 저장? List Dictionary화 JSON Serialize 하는 방법. 본문

창고/게임 개발 [Hidden]

유니티 C# 딕셔너리 저장? List Dictionary화 JSON Serialize 하는 방법.

도드! 2020. 10. 3. 18:51




유니티 C# 딕셔너리 저장?


유니티에서 Dictionary 를 JSON Serialize 하는 방법?


List를 Dictionary로 만드는 방법?



일단 확실히 해두어야 할점은 Dictionary 타입은 유니티의 JSON Serialization 을 지원하지 않는다.


이것은 유니티 에디터 상에서 Dictionary 타입의 변수를 만들어도 인스펙터에서 볼 수 없는 이유와 같다.


고로, 저장하려는 데이터 객체에 절대로 Dictionary 를 써서는 안된다.


Dictionary는 Serializable 타입이 아니다!



하지만 Dictionary 는 매우 빠른 속도와 편의성을 제공한다.


매번 for 문을 돌려서 아이디 string 을 대조하는건 매우 느리며 비효율적이다.


그럼 어떻게 Dictionary 타입을 데이터 저장과 연계해서 사용해야할까?


방법은 하나다. 


객체를 만들어서 ID 와 각종 필요한 데이터를 가지게 만들고 


해당 객체의 List를 JSON Serialization 으로 저장한다.


그리고 게임이나 프로그램이 시작될때 혹은 저장이 일어날때 


해당 List를 불러와서 for 문으로 훑어서 Dictionary를 구축한다.



한줄로 설명하자면


List -> Dictionary 방식.


단계별로 간단히 설명하면 다음과 같다.


0. Dictionary를 정의한다. (빔)


1. 객체 리스트를 만든다. (빔)


2. 객체 리스트에 필요한 객체를 넣는다.


(이때 주의할점은 List -> Dictionary 화 할것이기 때문에 중복을 허용해서는 안된다. 고로 추가하기 전에 Dictionary를 ContainKey()? 로 질의 한후 통과하면 List에 추가할때 Dictionary에도 동시에 추가해준다.)


3. Dictionary에 ID 값이 없는 객체는 객체 리스트와 딕셔너리에 저장한다.


4. 객체 리스트를 불러온다. (게임 시작시)


5. Dictionary화 한다.



실제 내가 사용한 예를 정리해보자.


어떤 씬이 있는데 그안에 여러 오브젝트들중 일부는 상호작용에 의해 파괴되거나 이동 혹은 비활성화 되어야 한다.


예를들어 어떤 씬안에 지뢰밭이 있는데 


플레이어가 지뢰를 전부 비활성화한 후 


다시 씬에 방문하면 힘들게 제거한 지뢰가 전부 다시 생성되어 있다!


이건 있을수 없는 일이다!


(OUTRAGEOUS!)


고로 해당 게임 오브젝트의 On/Off 상태를 저장할 객체를 만들었다.


처음에 접근한 방법은 Dictionary에 오브젝트 아이디와 데이터를 짝지어서 저장하려고 했으나


유니티 C# JSON Serialization 은 Dictionary를 지원하지 않는다. (God damn it!)


고로 다른 방법인 List -> Dictionary 를 시도했다.



저장할 객체다. 


딕셔너리와 달리 군더더기 없고 깔끔하게 잘 저장되며 잘 불러와진다.


상태 저장이 필요한 유니티 게임 오브젝트는 


GO_SAVE 객체에 현재 상태 (On/Off, 포지션)을 담고


스트링 아이디는 [현재씬의 이름 + _ + 게임 오브젝트의 이름] 으로 설정했다.


이렇게 완성된 객체는



와 같은 Dictionary 검사 과정을 거쳐서 존재 여부를 확인한후.



없으면 myData 의 GO_DB 라는 List에 쏙 넣어준다.


눈여겨 봐야할 점은 위에서도 설명했듯이 


List에 추가하면서 동시에 GO_Dic에도 추가하고 있다는 점이다.


(중복 걸러내기용 실시간 DB 추가임.)



그리고 게임이 시작될때 딕셔너리 구축함수를 불러내서 다시 GO_Dic 을 건설해준다.



이제 해당 씬이 불러와질때 


씬로더에 [상태를 유지해야하는 게임 오브젝트 List]를 for문으로 검사하며


GO_Dic에서 해당 ID로 GO_Save 데이터를 찾아서 게임 오브젝트를 동기화시킨다.



<3






반응형
Comments