월세 500 호기심 천국
9주차: 내 과자 포장지 누가 버렸어? - meta data 파일 (.meta) 파헤치기 본문
9주차: 내 과자 포장지 누가 버렸어? - meta data 파일 (.meta) 파헤치기
원펀치 쓰리 갓냥이 2024. 2. 24. 01:500주차: 인트로 - 새롭고 신기한 것을 좋아하거나, 모르는 것을 알고 싶어 하는 마음
1주차: Unity 엔진은 왜 개발 언어로 C#을 선택했을까?
2주차: 의외로 세상 잡다한 Transform에 대한 모든 것
3주차: EulerAngle아, Quaternion아, 둘이 싸우지 말고 사이좋게 지내야 한다~ (1/2)
4주차: EulerAngle아, Quaternion아, 둘이 싸우지 말고 사이좋게 지내야 한다~ (2/2)
5주차: 헐크 아저씨도 깜짝 놀란 Unity Render Pipeline이 작동하는 과정
6주차: 매 프레임 나보다 갓생 사는 Unity의 Life Cycle
7주차: 남들보다 더 갓생 사는 Coroutine의 충격적인 정체
8주차: 야물(YAML)딱진 그 녀석의 은밀한 속마음 - Unity Scene 파일 (.unity)
9주차: 내 과자 포장지 누가 버렸어? - meta data 파일 (.meta) 파헤치기
10주차: 철가방 채로 배달온 Unity 빌드 파일. 난 단무지 시킨 적 없는데, 왜 있지?
11주차: 마무리 - 후기
유니티 프로젝트 창에서만 보던 에셋들을 파일 탐색기를 통해 열어보면 원본 파일들과 함께,
열리지 않는 .meta 확장자의 파일들이 한 짝씩 세트로 있는 것을 알 수 있다.

모두 원본 파일의 이름을 그대로 담고 있고 맨 마지막에만 확장자로 .meta를 붙였을 뿐이다.
용량은 평균 3KB로 솜털만큼이나 가볍다.

이 에셋의 그림자 같은 녀석들의 정체는 뭐고,
대체 왜 존재하는 걸까?
.meta 파일 열어보기
본격적으로 궁금증을 해결하기 전에,
먼저 찍어먹어보는 방법이 있다.

일단 파일 탐색기로 열어보려 하면, 열리지 않는다.
(정확히는 확장자에 맞는 응용프로그램을 수동으로 선택해야 한다)
여는 방법을 따로 구글링해서 찾아볼 수도 있겠지만,
우선은 언제나 그렇듯 깃허브를 들어간다.

깃허브는 대부분의 파일들을 그에 맞는 형식으로 열어주는 다재다능한 친구이기에,
녀석을 믿고 2-2.jpg.meta를 조심스럽게 열어주면...?
fileFormatVersion: 2
guid: 8069e5455909aaa4d9733841896b1318
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMasterTextureLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
//
//
//
//후략
어... 홀리...
이게 뭘까.
생각보다 더 대단한 녀석이 나와버렸다.
(위 복사본에서는 뒷부분을 생략했지만 실제로는 123줄짜리 텍스트 파일이었다)
앞에서는 고작 3KB라고 하긴 했지만,
텍스트 파일 기준 3KB면 충분히 많은 양이라는 것을 잊고 있었다.
텍스트 내용이 생각보다 자세하기도 했고, 양도 적지 않은 만큼
무언가 확실한 역할을 맡고 있다는 것 쯤은 이제 알겠다.
그러니 이제 그 역할을 알아보자.
.meta 파일의 역할
.meta 파일을 열자마자 바로 두 번째 줄에서 익숙한 내용을 볼 수 있었다.
fileFormatVersion: 2
guid: 8069e5455909aaa4d9733841896b1318
.
.
.
바로 저번 주 .unity 씬 파일을 열면서 발견한 guid이다.

호... 그게 이 녀석이란 말이지?
유니티 내의 모든 에셋들은 전부 각각의 .meta 파일을 가지고 있었고,
그것들마다 저마다의 고유한 ID 번호를 소유하고 있었다.
저번 주에 열어보았던 .unity 파일 속 guid를 예시로 들면,
--- !u!4 &12438314 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 4808409092926342, guid: 70704ddec6bf2c543b7008ab52a9006d,
type: 3}
m_PrefabInstance: {fileID: 12438313}
m_PrefabAsset: {fileID: 0}
어떤 오브젝트의 Transform을 설명하면서,
해당 Transform을 담고 있는 오브젝트의 ID인 fileID,
그리고 이에 대응되는 아이템인 guid 번호를 기재한 것이다.
그러면 자연스레 70704ddec6bf2c543b7008ab52a9006d의 guid를 담고 있는 .meta 파일에 대응되는 에셋을 사용하겠다는 의미가 된다.
그렇다면 2-2.jpg.meta의 guid, 그 이후의 내용들도 한 번 살펴보자.
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
TextureImporter... 밉맵... 범프맵...
무언가 익숙한 용어들이다.
그것은 바로!!

유니티 인스펙터 창에서 에셋을 열람할 경우
옵션으로 볼 수 있었던 내용들이다.
mipmap의 경우 sRGBTexture, fadeout, bordermipmap, mipmapPreserveCoverage 등
이름까지도 일치하는 옵션들을 확인할 수 있다.
즉 .meta 파일은 에셋 각각의 세부 옵션들까지도 기록하고 있는 것이다.
우리가 유니티 상에서 이미지 파일의 해상도를 절반으로 낮춘다고 해서
원본 이미지의 해상도가 실제로 조정되지는 않는다.
원본은 기존 품질의 해상도를 유지하고, 유니티에서 적용될때만 더 낮은 해상도가 적용될 뿐이다.
때문에 이러한 옵션 정보를 .jpg 원본이 아닌 다른 곳 어디엔가 저장할 것이라고 예상 정도는 할 수 있었겠지만,
이렇게 간단한 방법으로 저장이 되어있을 것이라고는 생각하지 못했다...
.meta 파일 덕분에, 우리는 A 이미지의 파일명이 A-1로 바뀌어도
씬 전체에 참조되어있는 A 이미지는 그대로 유지된다.
어차피 유니티는 파일명이 아닌 각 에셋의 고유한 ID인 guid를 통해 에셋을 참조하기 때문이다.
(단, 유니티 프로젝트 창에서 파일명을 변경해야 한다.
유니티 외부에서 변경할 경우, (ex 파일 탐색기)
A 이미지가 사라지고 A-1 이미지가 들어온 것으로 인식하므로 아예 새로운 .meta 파일이 생성된다.)
반대로, 기존 A 이미지에 파일명만 같고 내용은 완전히 다른 새로운 A 이미지가 덮어 씌워져도,
A 이미지가 가지고 있던 옵션은 그대로 유지된다.
해상도, pixel per unit, pivot 등 전부 말이다.
.meta의 의미
통상적으로 메타(meta)는 자기 자신을 재귀적으로 가리킬 때 사용되는 말이다.
인식론에서는 단어 의미가 확장되어 "~에 대해서(about)"라는 뜻으로 사용하는데, 어떤 매체의 장르나 학문 분야 따위가 그 범주 스스로에 대해 이야기하는 경우(자기지시, 재귀)를 지칭하는 접두어로 쓰인다. 이를테면 영화에 대해 이야기하는 영화, 소설에 관해 이야기하는 소설, 윤리학에 관해 이야기하는 윤리학 등을 말할 때 메타-영화, 메타-소설, 메타-윤리학 등으로 쓰는 식이다. 메타픽션과 메타데이터 참고. 또한 매체뿐만 아니라 교육학에서도 사용된다. 자신의 학습법에 대해 생각하는 것을 메타인지(초인지/metacognition)라 한다.
'메타' 용어의 설명 -나무위키-
때문에 보통 메타 데이터라 하면 데이터에 대한 데이터를 말한다.
이미지라는 데이터가 있고, 그 이미지를 설명하는 데이터가 메타 데이터가 되는 것이다.
별 것 아닌 것 같아보이지만, 이는 데이터를 구조화하는 데에 큰 도움을 준다.
우리가 누군가에게 유니티 프로젝트 파일을 넘겨줄 때 .meta 파일을 제외하고 넘겨준다면,
넘겨받은 사람이 프로젝트를 열었을 때 그 안은 난장판이 되어있을 것이다.
넘겨받은 유니티를 처음 실행할 때 모든 .meta 파일들이 새롭게 일괄 생성될 것이고,
다시 guid가 랜덤하게 재배치 될 것이기 때문이다.
에셋의 옵션은 초기화될 것이고, 오브젝트 참조는 전부 꼬일 것이다.
때문에 유니티 파일을 공유할 때는 꼭 반드시 .meta 파일을 함께 공유해야 한다.
우리에게 데이터가 중요한 만큼,
이를 효율적으로 관리하기 위한 데이터에 대한 데이터 역시 중요하다.
분명 우리가 맛있게 먹고 즐기는 것은 과자의 포장지가 아닌 과자의 내용물이지만,
과자의 이름, 회사, 원산지, 유통기한, 알레르기 유의사항 등의 정보를 계속 활용하기 위해서는 포장지 박스를 버려서는 안된다.
포장지를 다 뜯어둔 채 그릇에 쌓아둔 과자 더미를 가리키며
외국인 친구에게 맛동산 한 조각만 갖다달라고 하면,
어떤 과자가 맛동산인지 알아내고 바로 갖다줄 수 있는 친구가 얼마나 있을까?
과자가 유통기한이 지났는지 안지났는지는 어떻게 구분할 수 있을까?
정보에 대한 정보가 필요하다.
에셋이라는 과자를 개별 포장하고 있는 과자 박스. 이것이 유니티의 .meta 파일이다.

사진을 보며 문득 든 생각은...
후레쉬베리가 먹고 싶어졌다.
촉촉한 초코칩은 엄청 달기 때문에,
이왕이면 후레쉬베리를 먼저 먹고 그 다음에 촉촉한 초코칩을 먹는 편이 좋을 것 같다.
유니티 .meta 파일과 후레쉬베리,
오늘 내용은 꽤 보람찼던 것 같다.
그럼 이번 주도 끝!
0주차: 인트로 - 새롭고 신기한 것을 좋아하거나, 모르는 것을 알고 싶어 하는 마음
1주차: Unity 엔진은 왜 개발 언어로 C#을 선택했을까?
2주차: 의외로 세상 잡다한 Transform에 대한 모든 것
3주차: EulerAngle아, Quaternion아, 둘이 싸우지 말고 사이좋게 지내야 한다~ (1/2)
4주차: EulerAngle아, Quaternion아, 둘이 싸우지 말고 사이좋게 지내야 한다~ (2/2)
5주차: 헐크 아저씨도 깜짝 놀란 Unity Render Pipeline이 작동하는 과정
6주차: 매 프레임 나보다 갓생 사는 Unity의 Life Cycle
7주차: 남들보다 더 갓생 사는 Coroutine의 충격적인 정체
8주차: 야물(YAML)딱진 그 녀석의 은밀한 속마음 - Unity Scene 파일 (.unity)
9주차: 내 과자 포장지 누가 버렸어? - meta data 파일 (.meta) 파헤치기
10주차: 철가방 채로 배달온 Unity 빌드 파일. 난 단무지 시킨 적 없는데, 왜 있지?
11주차: 마무리 - 후기
'내 맘대로 쓰는 Unity 심층분석 析深層分' 카테고리의 다른 글
| 11주차: 마무리 - 후기 (0) | 2024.03.07 |
|---|---|
| 10주차: 철가방 채로 배달온 Unity 빌드 파일. 난 단무지 시킨 적 없는데, 왜 있지? (0) | 2024.03.01 |
| 8주차: 야물(YAML)딱진 그 녀석의 은밀한 속마음 - Unity Scene 파일 (.unity) (0) | 2024.02.14 |
| 7주차: 남들보다 더 갓생 사는 Coroutine의 충격적인 정체 (0) | 2024.02.08 |
| 6주차: 매 프레임 나보다 갓생 사는 Unity의 Life Cycle (1) | 2024.02.04 |