유니티 Meta 파일, 스크립트 직렬화

2023. 10. 10. 20:13Unity

유니티 Meta 파일

 

Unity의 .meta 파일 Unity 엔진이 에셋과 관련된 정보를 저장하는 데 사용하는 텍스트 파일입니다.

Unity 프로젝트에서 생성되는 모든 파일에는 .meta 파일이 있습니다.

.meta 파일들은 다음과 같은 중요한 역할을 수행합니다.

  1. 에셋 식별자: Unity는 각 에셋에 고유한 ID를 부여하여 관리하며, 이 ID는 .meta 파일에 저장됩니다. 이를 통해 에셋 간의 연결성을 유지하고, 프로젝트 내에서 에셋을 일관되게 참조할 수 있습니다.
  2. 임포트 설정: .meta 파일은 해당 에셋의 임포트 설정 정보도 포함합니다. 예를 들어, 이미지 에셋의 경우 압축 방식, 해상도 설정 등의 정보가 여기에 포함됩니다.
  3. 버전 관리: .meta 파일은 버전 관리 시스템(VCS)와 함께 사용될 때 중요한 역할을 합니다. 만약 한 개발자가 새로운 에셋을 추가하면, 해당 .meta파일도 같이 커밋해야 다른 개발자들이 동일한 식별자와 설정으로 해당 에셋을 볼 수 있습니다.

Unity의 .meta 파일들은 보통 직접 수정하거나 조작하는 것이 아니라 Unity 엔진에 의해 자동으로 관리되는데, 이는 에셋의 일관성과 안정성을 유지하기 위한 중요한 부분입니다.

아래는 .meta 파일에 대해서 이해하고 있으면 도움이 되는 몇 가지 정보입니다.

  1. 파일 이동: Unity 내에서 에셋을 이동할 때에는 파일 시스템(예: 윈도우 탐색기) 대신 Unity Editor를 사용해야 합니다. 그래야 해당 에셋의 .meta 파일이 함께 이동되어 에셋 ID가 유지됩니다. 유니티 내에서 변경하는게 아니라 탐색기나 파인더가같은 곳에서 수정하게 되면 에셋 ID 가 유지되지 않습니다.
  2. 파일 이름 변경: 마찬가지로, 에셋의 이름을 변경할 때도 Unity Editor를 사용해야 합니다. 이름 변경 시 해당 .meta 파일의 이름도 자동으로 변경되며, 따라서 에셋 ID가 유지됩니다.
  3. 버전 관리: 버전 관리 시스템(VCS)를 사용하는 경우, 모든 .meta 파일들도 함께 커밋하고 푸시해야 합니다. 그렇게 하면 다른 개발자들이 동일한 에셋 식별자와 설정으로 프로젝트를 볼 수 있습니다.
  4. Visible Meta Files: 여러 사람이 함께 작업하는 프로젝트에서는 Edit > Project Settings > Editor > Version Control Mode: Visible Meta Files 옵션을 설정하여 .meta파일들이 명시적으로 보여지게 하는 것이 좋습니다.
  5. 복구와 문제 해결: 만약 어떤 문제로 인해 .meta 파일이 손상된 경우, 해당 파일을 삭제하고 Unity Editor를 재실행하면 새 .meta 파일이 생성됩니다(단, 연결된 모든 참조가 손실됨). 또한 특정 오브젝트에 문제가 생겼다면 해당 오브젝트의 .meta파일을 열어 확인함으로써 문제 해결에 도움이 될 수 있습니다.

 

직렬화(Serialization)

 

직렬화란 오브젝트 데이터를 연속된 문장형 데이터나 연속된 바이트 데이터로 바꾸는 과정으로,

Object -> Stream Of Bytes로 바꾸는 과정이다. (나열 방법은 Binary가 될 수도 있고 json, xml 같은 Text 파일이 될 수도 있다.) 이런 나열된 바이트를 File로 만들거나 DB에 저장하거나 Memeory에 올릴 수 있다.

 

역직렬화(DSerialization)

 

역직렬화는 직렬화된 데이터(연속된 바이트 데이터) 를 다시 재조립하여 오브젝트(Object)로 만드는 것이다.

Stream Of Bytes -> Object 즉 File, DB, Memeory를 다시 재조립 하여 Object를 만드는 것이다.

 

Unity 직렬화 내용

 

1. 파일 읽기 / 쓰기 : asset을 읽고 쓰고 하는 과정들, 여기서 Asset은 프로젝트의 기본 구성 요소이며 유니티 에디터 상 모든 리소스들이다.

2. Inspector Widow : 인스펙터 창에 표기되는 데이터들은 asset의 데이터들이 직렬화 되어 있는 것이다. (private로 선언 된 객체의 정보를 인스펙터 창에서 확인을 할 수 없는데 객체의 데이터 변화를 확인해야 하거나 Prefab 또는 Object를 넣어 주어야 할 경우가 생기는데 이때 직렬화를 통해 인스펙터 창ㅇ서 오브젝트의 정보를 확인할 수 있다.)

3. Script Relaoding : Script를 외부 Editor로 수정하고 Reload하면 유니티 에디터에서도 수정한 내용이 그대로 적용 되는데Script에 있는 데이터 자체도 직렬화돼서 저장되기 때문임

4. Prefabs : Asset의 일부이며 게임 오브젝트의 템플릿으로 게임 오브젝트의 생성과 재사용에 특화된 구체적인 형태다.

프리팹은 하나 이상의 게임오브젝트  컴포넌트가 직렬화된 데이터로 프리팹 인스턴스에는 프리팹 소스와 수정 리스트에 대한 레퍼런스가 포함되어 있다. 수정은 프리팹 소스에서 특정 프리팹 인스턴스를 생성하기 위해 Unity가 수행하는 작업이다. 프리팹 인스턴스는 Unity 에디터에서 프로젝트를 편집할 때만 존재한다. Unity 에디터는 게임 오브젝트를 두 세트의 직렬화 데이터(프리팹 소스와 프리팹 인스턴스의 수정 사항)로부터 인스턴스화한다.

5. Instantitation :

프리팹이나 게임 오브젝트처럼 일반적으로 씬에 존재하는 항목에 Instantiate 를 호출하면 Unity는 다음을 수행한다.

  1. Unity가 이를 직렬화한다. 이는 런타임 시 에디터에서 발생합니다. Unity는 UnityEngine.Object에서 파생한 모든 항목을 직렬화할 수 있다.
  2. Unity는 새로운 게임 오브젝트를 생성하고 새로운 게임 오브젝트에 데이터를 역직렬화한다.
  3. Unity는 다른 배리언트에서 동일한 직렬화 코드를 실행해 어떤 UnityEngine.Objects가 레퍼런스된 것인지 보고한다. 모든 레퍼런스된 UnityEngine.Objects를 체크하여 Unity가 인스턴스화하는 데이터의 일부인지 확인한다. 레퍼런스가 텍스처 같은 외부 요소를 가리키면 Unity는 해당 레퍼런스를 그대로 유지한다. 레퍼런스가 자식 게임 오브젝트 같은 내부 요소를 가리키면 Unity는 해당 복사본 레퍼런스로 패치한다.

6. Resources Folder

'Unity' 카테고리의 다른 글

유니티 최적화 - 메모리 최적화 : Object Pooling  (0) 2023.10.09
코루틴 (Coroutine), 스레드 (Thread)  (0) 2023.10.08
유니티 이벤트 함수  (0) 2023.10.07