[Unity] 21. Serialization 직렬화

치치·2025년 3월 24일
0

Unity

목록 보기
23/27
post-thumbnail

지금까지는 [SerializeField]를 사용하면 인스펙터에 노출되는구나! 그래서 값 변동을 쉽게 볼 수 있구나! 정도로만 이해했습니다

요약 :
1. 유니티 직렬화는 데이터를 인스펙터창에서 바로 볼 수 있으며, 데이터 수정이 용이하다
2. 직렬화를 통해 메모리를 YAML, JSON 과 같은 형태로 변환하여 파일로써 저장된다
3. 프리팹은 씬파일에 저장되지 않고 별도의 파일로 생성된다


CS 의 직렬화 정의

개체를 저장하거나 메모리, 데이터 베이스 또는 파일로 전송하기 위해 객체를 연속적인 바이트 스트림으로 변환하는 프로세스

유니티에서 직렬화를 하게되면 연속적인 형태로 변환되어 저장된다.

주로 많이 사용되는 형태는 사람들이 읽을 수 있는 아스키 코드 형태이다.
-> ex) XML, YAML, JSON

이진 형태로 저장되기도 한다


유니티 직렬화 정의

스크립트 직렬화

데이터 구조나 오브젝트 상태를 유니티 에디터가 저장하고, 나중에 재구성 할 수 있는 포멧으로 자동 변환하는 프로세스

❗ 쉽게 말하면 유니티의 게임오브젝트나 프리팹등이 직렬화 하여 사람이 읽을 수 있는 형태로 변환되어 저장되는 것

  • public : 기본적으로 유니티 기본 직렬화 지원 (에디터에 보임)

  • private : 기본 직렬화 x [Serializefield]를 추가해야 직렬화 된다

  • C# 스크립트에서 구조체나 리스트 등은 기본 직렬화 지원이 되지 않기 때문에 [System.Serializable] 선언 필요


System.Serializable 표기법

  • using System; 을 선언했을 경우, 생략하고 [Serializable] 가능


직렬화 예시

  • 실제 유니티 폴더를 열어서 Assets 폴더 내부를 확인해보면 여러 파일이 있는 것을 알것이다
  • 직렬화된 파일은 무조건 데이터(에셋) 파일과 .Meta 파일이 존재한다

편집기로 열었을 때 확인할 수 있는 .Meta 파일 내용

  • guid : 에셋의 아이디

편집기로 열었을 때 확인할 수 있는 에셋 파일 내용

  • 주로 저장형태는 YAML 파일 & JSON 파일
    -> 유니티 직렬화 하는 것들은 대부분이 다 YAML 파일로 변환한다

  • YAML 형태의 파일안에 씬의 정보가 담겨있다 -> 씬에 배치된 게임오브젝트 & 컴포넌트들 & 현재 적용된 환경 등

  • ex) 씬에 저장된 메인 카메라 오브젝트의 정보를 확인할 수 있다

  • 동일한 fileID를 가진 컴포넌트 : 메인 카메라 오브젝트 == 카메라 컴포넌트


만약 게임 오브젝트에 스크립트 부착 시 직렬화로 어떻게 보일까?

게임 오브젝트에 스크립트를 부착한 뒤 에셋 파일을 확인해보았을때
스크립트에 fileIDguid가 같이 있는 것을 확인할 수 있다.

위에서 봤을때 처럼 컴포넌트의 fileID만 있는 경우는 게임 오브젝트 자기 자신이 가지고 있는 컴포넌트를 말한다

스크립트의 경우 게임 오브젝트가 외부 에셋(스크립트)을 참조하고 있는 것이기 때문에
guid도 가지고 있다
-> 여기서 guid는 이 스크립트(에셋)의 아이디
-> 스크립트는 .cs파일.Meta파일


프리팹과 스크립터블 오브젝트

Prefab

프리팹은 게임 오브젝트와 컴포넌트를 직렬화 한 데이터이다

씬에 있는 정보가 아니기 때문에 별도로 저장한 직렬화 데이터이다
-> 에셋 파일이 아닌 별도의 파일로 생성된다


ScriptableObject

클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너이다

Monobehaviour를 상속받지 않으며 YAML 형태의 파일이다

중복된 내용을 묶고 참조해서 사용하기 때문에 메모리 절약에 용이하다

코드 의존성이 낮아진다

참고 : https://unity.com/kr/how-to/architect-game-code-scriptable-objects



(Built-in Serialization)

빌트인 직렬화란, 유니티 엔진이 자동으로 처리하는 직렬화 시스템

1. 저장 & 로드
씬에 배치된 게임 오브젝트, 컴포넌트, 프리팹, ScriptableObject 등은 자동 직렬화되어 파일로 저장된다

2. 인스펙터창
인스펙터창에 노출된 변수들을 유니티가 자동으로 YAML 파일로 저장

3. 유니티 에디터 스크립트 재로드

4. 프리팹
자동 직렬화 된다

5. 인스턴스화 (Instantiate)
-> 원본 프리팹은 직렬화되어 저장되지만, 동적생성된 오브젝트는 직렬화 x 여서 저장되지 않는다
-> 만약 동적생성된 오브젝트를 저장하려면 Json으로 저장


직렬화 조건

참고 영상 : https://www.youtube.com/watch?v=kEu_AQ_Es-8

profile
뉴비 개발자

0개의 댓글