공부

Unity Serialization

상연 2023. 11. 24. 22:56

목차

    Serialization(직렬화)

    개체를 저장하거나 메모리, 데이터베이스 또는 파일로 전송하기 위해 개체를 바이트 스트림응로 변환하는 프로세스.
    주 목적은 필요할 때 다시 개체로 만들 수 있도록 개체의 상태를 저장하는것.

    즉, 개체의 정보가 메모리 이곳저곳에 저장되어있는데 이를 다른 곳과 주고받기 위해서 해주는 것.

    이진파일형식으로도 많이 하지만 주로 저장을 한다는 것은 사람이 보기 위함이기때문에

    XML / YAML / JSON 이러한 사람이 읽을 수 있는 형식으로 하는 경우가 많다.

    Unity에서 내부적으로 Serialization 되는 방식은 YAML이다. (Object Scriptable , Prefab, ... etc)

    Json은 Pakage 파일의 정보를 담을때 자주 사용된다. (Unity), 물론 이 외에 통신할때나 Web에서 자주 사용

    이와같이 Script를 Component에 올려놓고 Inspector에서 볼 때에 정보를 보고 수정한다는것이

    직렬화가 되었다는 것이다.

    직렬화가 되는 조건이 이렇게 여럿 있는데 위의 코드에서 Struct는 Primitive data type도 아니고 고정사이즈 버퍼도 아니지만 보면 Custom classes with the Serializable Attribute 가 있다. 

    위에서 Serializable을 선언해주었기 때문에 직렬화가되어 Inspector창에서 확인이 가능한 것.

    Unity에서 왜 중요한가?

    Asset Dependency때문에 중요하다.

    예를들어 Tank Object가 있다고 하면 여러개의 Material이 있고 Textture가 있다.

    그리고 그 안에서 서로 종속성을 갖는다.

    meta파일은 아니지만 Scene파일의 경우 YAML 형식으로 이렇게 저장되어있다.

    그래서 Unity를 하다보면 보이는게 있다. 꼭 .meta파일이 존재한다는 것.

    이 meta파일은 해당 파일이 어떻게 연결되어있고 사용되어있는지를 YAML type으로 저장해놓은것이다.

    그래서 이를 빼놓고 VCS(git..etc)에 업로드하게 되면 꼬여버린다!

    기존에 Setup한 설정값이 다 사라지기 때문에...!

     

    빌트인 직렬화

    Prefab은 게임 오브젝트 및 컴포넌트의 직렬화된 데이터

    -> 통상 말하기로는 게임 오브젝트를 재사용성이 쉽도록 데이터 파일화 한것이라고 하는데 이게 그 말이다.

     

    ScriptableObject

    Asset화 시킨 데이터 구조라고 생각하면 편하다.

    Inspector에 올려서 사용 할 수 없고, Monobehaviour가 참조해서 데이터를 가져오기 위함이라고 생각

    이런 Scriptable Object를 사용하게 되면 같은 데이터를 공유하는 상황이 있을때

    의존성을 줄이고 유지보수를 용이하게 할 수 있다.

     

    최근 트렌드 (XML / JSON / YAML)

    최근에는 JSON의 범용성이 굉장히 많이 커진 상황.

    그리고 Unity에서 제공하는 JsonUtility의 속도가 굉장히 빠르다.

     

    해당 포스팅은 유니티 공식 유튜브 채널에 올라온 데이터 시리얼라이제이션 완전 정복하기를 보고 정리한 글입니다.

    그동안 Inspector에서 보인다 정도로만 알고 쓰고 있었는데 자세히 알게 되었습니다.

    https://www.youtube.com/watch?v=kEu_AQ_Es-8