유니티 씬 파일은 텍스트 파일이다. (*YAML 형식)
.unity 씬 파일은 단순한 파일이 아니라, 오브젝트들의 구성 정보, 좌표, 연결 정보 등 수많은 메타데이터를 포함한다.
참고 사이트: https://docs.unity3d.com/kr/current/Manual/FormatDescription.html
프로젝트를 생성하면 생성되는 SampleScene에 2D Square 오브젝트를 생성하고 저장했다.
--- !u!1 &1303703322 문자열을 포함하고 있다. !u! 이후 나타나는 첫 번째 숫자는 오브젝트의 클래스를 나타내며, 이 경우에는 게임 오브젝트(!u!1)입니다. 앰퍼샌드 기호(&) 다음에 나타나는 숫자는 파일에서 고유한 오브젝트 ID 번호이며, 이 숫자는 각 오브젝트에 임의로 할당된다.
만약 위와 같이 나온다면
[Edit] - [Project Settings] - [Asset Serialization] - [Mode]를
Force Text로 변경해 줘야 한다.
각 컴포넌트에도 마찬가지로 오브젝트의 클래스와 고유한 오브젝트 ID를 가지고 있으며 m_Component를 확인해보면 등록된 컴포넌트의 고유 ID를 가지고 있다.
m_Component:
- component: {fileID: 1303703323}
해당 ID를 찾아서 --- !u!212 &1303703323의 내용을 확인해 보면 게임 오브젝트에 할당된 컴포넌트는 SpriteRenderer였다.
컴포넌트에도 마찬가지로 게임 오브젝트의 고유 ID가 저장된다.
m_GameObject : {fileID: 1303703322}
이번에는 스크립트 Square.cs를 하나 생성해서 2D Square 오브젝트에 할당해 줬다.
해당 컴포넌트의 번호를 확인해보면
m_GameObject: {fileId: }현재 컴포넌트가 연결된 GameObject가 어떤 건지 나타내는 정보고,
m_Script에는 어떤 스크립트를 참조하는지guid가 적혀있었는데
그건
.meta파일에 기록 돼있었다.
이번에는
Square스크립트에private변수 하나를 선언해줬다.
SerializeField를 추가했을 때는 아무런 반응이 없지만 (Unity는 디폴트 값은 저장하지 않고, 변경된 값만 직렬화해서 저장한다. -> 그래서 Scene에서 해당 값이 수정되어야 직렬화된다.)
Scene에서 값을 변경하면 다음과 같이 Scene 파일에m_EditorClassIdentifier:속성에level: 3이 추가됐다.
객체나 데이터 구조를 파일이나 메모리에 저장하거나 전송 가능한 바이트 (Byte) 형식으로 변환하는 과정
⚔ level 직렬화 예시
[SerializeField]private int level = 3; -> level: 3
public으로 새로 변수를 선언해서 추가했을 때도 마찬가지로 아무런 반응이 없지만 Scene에서 값을 변경을 하면m_EditorClassIdentifier에age: 2가 추가 됐다.
[현재 Inspector에서
Square의 정보]
GameObject를 이 상태에서 Prefab으로 변경했더니 Scene에서 원래 GameObject의 정보가 사라지고 Prefab 정보가 추가되고
Scene에서 설정한 값은
.prefab에서 저장을 하고 있다. ( Scene에서 만약 많은 정보를 변경하고 병합할 때 충돌이 일어난다면 모든 값을 다시 입력해 줘야 할 수 있다. 그러므로 Scene에서 속성이 변경된 것은 Prefab화를 시켜주는 것이 좋을 것이다. )
YAML은 "YAML Ain't Markup Language"의 줄임말로, 사람이 읽기 쉽고 쓰기 쉬운 데이터 포맷이다.
JSON이랑 비슷한 역할을 하는데, 가독성이 더 좋고 주석도 가능해서 설정 파일 등에 많이 쓰인다고 한다.
유니티에서 Asset Serialization:를 Force Text 설정하면 .prefab, .unity, .asset 파일들이 YAML 형식으로 저장된다.
⚔ YAML의 단점
데이터 직렬화가 불편하다. 아예 불가능하지는 않고 이스케이핑을 사용할 수는 있겠지만 그럴 바에는 JSON을 사용하는 편이 낫다. 따라서 데이터 전송, API 등에서는 거의 쓰이지 않는다.
참고 사이트 : https://namu.wiki/w/YAML
⚔ YAML 기본 구조
name: Alice
age: 30
isPlayer: true
skills:
- shooting
- stealth
- hacking
⚔ YAML의 특징
Key:Value 구조
들여쓰기로 구조 구분 (중괄호 {}는 없다)
리스트는 - 로 표현한다.
이번 프로젝트는 규모가 크지 않아서 5명에서 하나의 씬에서 작업을 했다.
branch 병합을 하고 유니티 에디터에서 씬에 게임 오브젝트를 추가하고 다시 삭제를 했는데 다음과 같이 변경되는 값들이 많았다.
그래서 씬은 Discard하고 각자 작업한 부분은 전부 prefab화 시켜서 merge를 시켰다.튜터님께 들은 해결 방안은 각자의 맡은 기능을 기획단계에서 확실하게 세분화하고 같은 프리팹과 씬에서 작업을 하지않는 것을 추천해주셨다.