유니티 meta 파일
유니티 *.meta 파일은 뭐길래 모든 Asset(파일)마다 생성이 될까?
유니티의 메타(meta) 파일은?
Asset을 식별할 수 있게 하는 값이랑 그 Asset에 대한 설정 값, 예를 들어서 크기, pivot 위치, 상태, ... 등,을 저장하는 파일이다.
위의 사진을 보면 모든 asset(위의 사진에서는 스크립트)에 대응하는 메타 파일이 존재한다는 사실을 알 수 있다.
유니티의 메타 파일을 이해하려면 먼저 유니티가 Asset을 내부에서 처리하는 방식에 관해서 이해해야 한다. Asset 내부 처리 방식부터 알아보자.
* 출처: 이 부분에 대한 내용은 [유니티 매뉴얼: Behind the Scenes]을 보면서 정리했습니다.
Asset을 Import하거나 새로운 파일을 (유니티 Assets폴더 안에) 생성하면 Unity 안에서는 어떤 일이 일어날까?
1. 먼저 unique한(= 하나만 존재하는, 유일한) ID값을 할당한다.
- 유니티는 어떤 asset을 Assets폴더에 안에 추가하면 새로운 파일이 추가됐다는 것을 감지한다.
(유니티 에디터는 주기적으로 알고 있는 asset 목록을 기반으로 새로운 asset이 들어왔는지 찾는다고 한다) - 유니티는 새로운 파일이 발견됐다면 바로 그 asset에게 하나밖에 존재하지 않는 Unique 한 ID를 부여한다. 이 ID는 유니티 내부적으로 asset을 참조하는데 쓰인다. 그렇게 함으로써 유니티는 asset의 이름을 수정하거나 위치를 바꿔도 부여한 ID를 통해 그 asset을 찾을 수 있게 된다.
- 조금 더 구체적으로 설명을 해보겠다.
내가 유니티 Assets폴더 안에 있는 groot.jpg파일을 이용해 작업을 하고 있었다고 해보자.
Unity는 그 asset을 unique한 ID를 통해 찾으므로 groot.jpg 파일을 Assets/Resources/Sprite 폴더로 파일을 옮기거나 CodingGroot.jpg로 이름을 바꿔도 (그 파일이 뭐였는지 잃지 않고) 부여한 ID를 통해 그 파일을 참조할 수 있다.
2. 그 다음으로 *.meta 파일을 생성한다.
좌변의 윈도우 탐색기로 연 Assets 폴더를 보면 각각의 asset(Scenes폴더와 groot.jpg)에 대응되는 메타 파일들이 만들어졌는다는 것을 알 수 있다.
<참고> 유니티 프로젝트 창(Project View)에서는 기본적으로 메타(*.meta) 파일이 안 보이도록 설정되어있다.
- 위의 1.에서 설명했던 유일한 Asset ID는 *.meta 파일에 저장된다. 메타 파일은 asset이 존재하는 폴더에 생성이 되고 대응되는 [asset명].meta로 이름이 정해진다.
- groot.jpg를 추가했으면 groot.jpg.meta라는 이름으로 파일이 생성된다.
- 유니티 내에서 Asset 파일을 옮기거나 이름을 바꾸면 메타 파일의 위치(디렉토리)를 파일이 있는 곳으로 이동시켜주고 메타 파일의 이름도 자동으로 변경해준다.
- 하지만 유니티 외부(ex. 유니티가 아닌 윈도우)에서 파일을 조작할 경우는 유니티가 변경됐다는 것을 감지하지 못하기 때문에 그 메타 파일도 우리가 수동으로 바꿔줘야 한다.
- 그래서 유니티 내에서 파일을 옮기지 않고 윈도 탐색기나 맥의 finder를 통해서 Assets 폴더 내의 파일들의 이름을 바꾸거나 파일을 옮기면 유니티는 메타 파일을 잃어버리게 된다.
그렇기 때문에 유니티 외부에서 파일을 옮길 때는 해당하는 메타 파일도 같이 옮겨주고 유니티 외부에서 파일명을 바꿀 때는 메타 파일의 이름도 알맞게 변경해주자!
이렇게 해야 메타 파일을 잃어버리지 않는다.
그럼 어떤 asset의 메타 파일을 날리거나 누락하면 어떻게 될까?
- 유니티 외부에서, 예를 들어서 윈도 탐색기에서, groot.jpg 파일을 grootDancing.jpg로 파일명을 수정하고 유니티로 돌아와보자.
유니티에서는 어떤일이 일어나게 될까?
유니티에 돌아오면 grootDancing.jpg.meta파일이 없으므로 grootDancing.jpg 파일은 새로 Import 된 파일과 동일한 취급을 받는다.
유니티는 grootDancing.jpg를 식별하기 위한 새로운 ID를 부여하고 다시 grootDancing.jpg.meta파일을 만들고 ID를 저장한다.
처음에 생성된 메타 파일인 groot.jpg.meta파일은 대응되는 asset파일이 없으므로 삭제된다.
만약 Image Component의 속성인 Source Image에 groot.jpg를 할당해 줬다면 그 속성은 groot.jpg.meta파일에 있는 ID값으로 대응되는 asset을 찾으려고 할 것이다. 그런데 이름이 수정된 grootDancing.jpg 파일은 새로운 ID값을 발급받았으므로 Image Component는 아무것도 찾지는 못하게 된다. 아무것도 못 찾은 Image Component는 해당하는 속성을 Missing이라고 표시한다. (메타 파일을 인지하지 않고 개발했다면 이 Missing이라는 문구가 매번 귀찮게했을 것이다ㅋㅋ)
- asset이 존재하는 폴더 옆에 메타 파일이 없어도 마찬가지이다. 유니티 외부에서 파일을 옮길 때는 메타 파일과 같이 옮겨주자!
추가적으로, 메타 파일은 Asset에 대한 설정 정보(Import Settings) 또한 저장한다.
- 메타 파일은 Asset의 Import Settings를 저장한다.
(Import Settings는 Asset의 형태와 어떻게 나타낼지에 대한 정보들이다.) - Import Settings는 Project View에서 Asset을 클릭하면 Inspector에 나타난다.
(Asset의 종류에 따라 Import Setting도 다르다.) - 예를 들어서 Image의 Import Settings로는 Texture Type, Wrap Mode, Aniso Level, ... 등이 있다.
- FBX 파일의 Import Settings으로는 Scale Factor, Convert Unit, Mesh Compression, Optimize Mesh, ... 등이 있다.
- 메타 파일을 실수로 없앴을 때 다시 missing된 부분만 넣어준다고 생각할 수도 있다. 하지만 메타 파일은 Import Settings도 저장하고 있기 때문에 만약에 메타 파일이 누락되면 Prefab이 깨지거나 FBX설정이 초기화되는 등 엄청 많은 문제를 일으킬 수 있으니 조심해야 한다.
Git으로 협업할 때, 작업한 asset과 그 메타 파일도 올리도록 주의하자.
- 만약 메타 파일이 누락된 채로 push가 되는 순간 숨은 커밋 찾기가 시작된다. 이 커밋을 다른 사람이 pull하고 유니티를 키는 순간 각각의 유니티마다 새로운 메타 파일이 생성한다. 그러다가 각각의 팀원이 git에 push 하기 시작할 것이고 그 이후부터는 매번 충돌이 날 것이다... 병합하면 사람글마다 null pointer exception같은 오류가 나기 시작할 것이다. 갑자기 이게 뭔가 싶으면서도 짜증날 것이다ㅎㅎ...
- 그리고 Visual Studio는 메타 파일을 무시해도 되는 것으로 알고 있다. 가끔 Visual Studio 유니티 작업하시는 분들 중에서 유니티 gitignore에 Visual Studio의 gitgnore도 추가하는 분들이 계신데 그러면 망한다. 메타 파일이 다음부터 추적이 안 되게 돼서 pull할 때마다 항상 Asset 설정들이 날아갈 것이다.
유니티 외부(예를 들어서 카톡)로 파일을 공유할 때 메타 파일을 누락하기 쉽다.
그럴 때는 Unity Package의 형태로 공유하자.
- Unity Package에는 메타 파일 정보도 다 포함이 된다.
그렇기 때문에 Export 기능을 통해서 Unity Package의 형식으로 파일을 주고 받으면 메타 파일 신경 쓸 필요가 없다. - Unity Asset Store에 있는 Asset들을 생각하면 왜 편한지 알 수 있다.
Unity Asset Store에 있는 Asset들은 Unity Package의 형식으로 업로드한다. 그래서 구매한 Asset을 Import를 해도 그 Asset에 대한 reference를 잃지 않고 우리가 사용할 수 있는 것이다.
결론
- 유니티는 새로운 Asset이 인식되면 그 Asset을 식별하기 위한 ID를 발급하며 이 ID는 메타 파일에 저장된다.
- 메타 파일은 Import Settings도 저장한다.
- 유니티 내에서 작업하자.
어쩔 수 없이 유니티 외부에서 파일을 옮기거나 이름을 바꿀 일이 생기면 그 메타 파일의 파일명도 같이 대응되도록 옮기거나 수정해주자. - 외부로 파일을 공유해야 할 상황이 생기면 Unity Package 형식으로 공유하는 게 편하다.
- 협업 시 메타 파일이 중복되어 생성되지 않도록 주의하자.
출처
이 글은 우연히 구글링하다가 발견한 일본 유니티 개발 문서 번역본을 읽으면서 제가 삽질한 경험을 떠올리며 정리한 글입니다. 아주 예전에 메타 파일에 대해 찾아보다가 발견한 글(파일이였던 것 같기도하고..)이라 출처가 잘 기억이 안 납니다. 나중에 원본 글을 발견하면 출처에 남기도록하겠습니다. 혹시 아시는 분께서는 댓글로 남겨주시면 감사하겠습니당.
댓글
이 글 공유하기
다른 글
-
[유니티] 모든 자식들 접근하기
[유니티] 모든 자식들 접근하기
2020.02.26 -
[유니티/C#] StringBuilder 정리 및 사용법
[유니티/C#] StringBuilder 정리 및 사용법
2020.02.26 -
[유니티] Bool 난수 생성하기
[유니티] Bool 난수 생성하기
2020.02.26 -
[유니티] GameObject 없이 코드 실행하기
[유니티] GameObject 없이 코드 실행하기
2019.07.19