Notice
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

월세 500 호기심 천국

10주차: 철가방 채로 배달온 Unity 빌드 파일. 난 단무지 시킨 적 없는데, 왜 있지? 본문

내 맘대로 쓰는 Unity 심층분석 析深層分

10주차: 철가방 채로 배달온 Unity 빌드 파일. 난 단무지 시킨 적 없는데, 왜 있지?

원펀치 쓰리 갓냥이 2024. 3. 1. 01:30
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주차: 마무리 - 후기

 


 

유니티로 게임을 개발하고 빌드하면,

.exe 파일과 함께 꼭 보이는 파일들이 있다.

(windows용 빌드 기준)

2개의 영문 모를 폴더명과, 의문의 .exe, .dll 파일.

 

모바일 .apk 파일처럼 실행에 필요한 .exe 파일 하나만 깔끔하게 나오면 참 좋을 텐데...

왜 저런 파일들이 항상 같이 붙어나오는 걸까?

 

순서대로 하나하나 자세히 알아볼 필요가 있다.

 

어차피 꼭 딸려나오는거, 안에 뭐가 들었는지 알고 먹는게 더 맛있지 않겠는가?

 

게임명_Data 폴더

그래도 다른 파일들에 비해 이름이 정직한 편이다.

대충 게임에 필요한 데이터들이 들어있겠지...

하는 생각으로 폴더를 열어보면?

뭐가 또 이렇게 많은걸까...

 

Managed, Plugins, Resources...

수많은 폴더와 파일들이 그 안에 숨어있었다.

이것도 또 차례대로 열어봐야겠는걸.

 

Managed 폴더

 

Managed 폴더 안에는 유니티 실행 코드를 컴파일한 여러 코드들dll의 형태로 저장되어있다.

Cinemachine, UnityEngine, UnityEngine.UI 등 우리가 스크립트 상에서

using문을 통해 불러와 사용하는 코드들도 있어서 반가웠다.

 

Plugins 폴더

Plugins 폴더 내부에는 몇 개의 폴더가 더 있었고,

타고 타고 끝까지 들어가봐도 막 엄청난 것들이 있다거나 하지는 않았다.

유니티 외부에서 제공되는 플러그인들이 담겨있는 폴더라고 한다.

내 게임의 경우 스팀 출시를 위해 관련 플러그인을 사용했기 때문에

해당 폴더에 steam_api64.dll이 포함되어 있었다.

 

Resources 폴더

Resources 폴더에 있는 것들.

유니티의 기본 기능들이 들어가있다.

Texture, Material, Font, Mesh, MonoBehaviour등 필수적인 요소의 경우 unity default resources에,

Shader와 같은 선택적인 요소의 경우 unity_builtin_extra에 따로 담겨있다고 한다.

 

기타 파일들

app.info

.info라는 생소한 확장자의 파일이다.

하지만 메모장으로 열어보면 게임의 이름, 제작사명이 들어있는 것을 알 수 있다.

globalgamemanagers

서로 비슷한 이름으로

globalgamemanagers,

globalgamemanagers.assets,

globalgamemanagers.assets.resS

세 종류가 있으며, 각각의 역할 역시 다르다.

 

globalgamemanagers

- 유니티 프로젝트 내 대부분의 설정들이 다 담겨있다.

- PlayerSettings, GraphicsSettings, BuildSettings, Physics2DSettings 등.

globalgamemanagers.assets

- 위의 것과 이름이 비슷해 헷갈릴 수 있지만, 역할이 엄연히 다르다.

- ShaderMonoScript(스크립트의 이름, 클래스명, 네임스페이스 등)에 대한 정보를 담고 있다.

globalgamemanagers.assets.resS

- globalgamemanagers.assets에서 상대적으로 용량이 큰
  이미지, 음성, 동영상 등을 외부에서 불러올 때 사용된다.

level0, level1, level2, ... , levelN

프로젝트마다 존재하는 level 파일의 개수가 다르며,

각 파일별로 자신의 번호에 대응되는 씬의 정보를 담는다.

level0의 경우 Scene[0], level1의 경우 Scene[1]과 같은 식이다.

당연히 level 파일은 씬의 개수만큼 존재한다.

resources.assets, resources.assets.resS

각 씬에 묶여있는 리소스들이 아닌,

게임의 런타임 시점에서 자유롭게 로딩되는 리소스들을 담고 있다.

유니티 에디터 상에서 Resources 폴더 안에 넣어두는 에셋들을 생각하면 될 것 같다.

때문에 런타임 로딩 특성상 게임 내에서 사용되지 않는 파일들도 포함되어 있을 수 있다.

.resS의 경우 아까와 마찬가지로 상대적으로 용량이 큰 이미지, 음성, 동영상 등을 불러올 때 사용된다.

sharedassetsN.assets, sharedassetsN.assets.resS

게임 내 실질적인 에셋들이 전부 담겨있는 핵심 파일이다.

levelN에 등장하는 에셋들이 각 번호에 맞는 sharedassetsN.assets에 저장된다.

때문에 _Data 폴더 내의 파일들 중 용량이 가장 크며,

특히 상대적으로 용량이 큰 이미지, 음성, 동영상 등이 담아내는 .resS의 경우

작성자가 빌드한 게임 기준 1GB가 넘게 나왔다.

평소 즐겨 하던 게임의 클라이언트를 뜯어보고 싶은 유저라면

사실상 가장 먼저 뜯어봐야 할 파일이다.

 

 

이로써 양이 제일 많은 게임명_Data 폴더를 전부 뜯어보았다.

다음은 MonoBleedingEdge 폴더이다.

 

MonoBleedingEdge

음... 열어봐도 사실 별게 없다.

더 들어가보아도 .dll 파일만 몇 개 있을 뿐이고,

(프로그램을 실행시키기 위한 C#, MonoDevelop 라이브러리)

하위 경로인 etc로 들어갈 경우 유니티가 사용하는

mono 가상머신 관련 파일들이 담겨있는 mono 폴더를 볼 수 있다.

 

UnityCrashHandler64.exe

게임 실행 파일과 같은 확장자인 .exe 파일이다.

유니티 게임을 한 번이라도 직접 실행해본 사람들은

호기심에라도 몇 번 눌러봤지만, 실행은 잘 되지 않았을, 그런 파일이다.

그도 당연할 것이, 이 파일은 애초에 직접 창을 열어서 실행시키는 그런 파일이 아니다.

 

이 파일은 Unity 내부에서 충돌이 나거나 문제가 생겼을 때

개발자가 문제를 식별하고 수정하기 위해 사용하는,

크래시 핸들러 실행 파일이다.

 

의외지만, 이 파일을 삭제하더라도 게임의 실행에 전혀 영향을 끼치지 않는다.

오히려 어떤 경우에는 플레이 중인 게임에서 버그가 발생했는데,

크래시 핸들러 파일을 삭제하고 문제가 사라졌다는 사람도 있는 것 같다.

 

어찌됐든 이를 통해 알 수 있는 것은,

게임 유저 입장에서는 크게 중요한 파일이 아니라는 것이다.

 

UnityPlayer.dll

이미 .dll 파일은 앞에서도 많이 나오긴 했지만,

이제 와서라도 더 정확한 의미를 알아보자면 Dynamic Link Library라는 뜻이다.

여러 프로그램에서 동시에 사용할 수 있는 코드와 데이터를 포함하는 파일의 유형이다.

 

모두가 흔히 쓰는, 말 그대로 두루두루 자주 쓰이는 코드들.dll 형식으로 배포하면,

우리는 해당 .dll을 불러온 뒤 함수를 호출하여 그 기능들을 편하게 사용할 수 있는 것이다.

 

우리가 Unity C# Script를 작성할 때 UnityEngine, UnityEngine.UI 등을 using문을 통해 가져오는 것도

유용한 함수와 클래스들이 UnityEngine.dll, UnityEngine.UI.dll의 형태로 저장되어있기 때문이다.

 

그 중 이 UnityPlayer.dll의 경우 유니티에 있어서 가장 핵심이라고 볼 수 있겠다.

유니티 공식 문서에는 이 파일이 유니티의 native 엔진 코드를 모두 포함한다고 설명한다.

때문에 해당 파일이 없으면 게임 자체가 실행이 되지 않고,

구글에 조금만 검색해봐도 이 파일이 없어 게임이 실행되지 않는다며

문제를 해결해달라는 글이 꽤 많이 올라와있음을 알 수 있다.

 

유니티의 빌드 파일 구조를 조금만 알고 있는 사람이라면,

아무데서나 굴러다니는 UnityPlayer.dll 파일 하나를 복사해다가

문제되는 게임 실행 파일 옆에 붙여넣어 문제를 바로 해결했을 것이다.

 

나중에 나한테도 그런 일이 생기면 멋지게 써먹어봐야지.

 

마무리

 

이렇게 해서 철가방 채 배달온 Unity 게임 빌드 파일 5형제를 모두 뜯어보았다.

게임 실행에 있어서 정말 필수적인 젓가락 같은 녀석들도 있었고,

있으나 마나한 양파 춘장 같은 녀석도 있었다.

생양파가 있든말든 결국 유저한테는 실행만 잘 되면 장땡인걸

 

사실 짜장면을 요리하는 사람이나, 짜장면을 먹는 사람이나,

왜 같이 나오는 단무지의 색이 항상 노란색인지,

왜 군만두는 꼭 주름 잡힌 초승달 모양이어야 하는지

꼭 알아야 할 필요는 없다.

 

그냥 다른 중국집에서도 다 기성품으로 주고,

우리도 그렇게 먹는게 보통 맛있기 때문이다.

 

하지만 글 도입부에서 말했듯,

알고 먹는 것모르고 먹는 것에는 차이가 있다.

 

혹여나 식당만의 차별화된 단무지가 필요하다는 생각이 들 때

이전에 배워두었던 레시피를 응용해 직접 담가서 대접할 수도 있는거고,

군만두도 직접 만들어 이윤을 더 노려볼 수도 있는 것이다.

그게 또 색다른 맛으로 대박이 날 수도 있는거고.

 

짜장면을 요리하는 사람이나, 그것을 먹는 사람이나,

오직 알고 있는 자만이 이것들을 누릴 수 있다.

 

 

지금껏 약 10주 가량의 기간 동안 열심히 유니티를 파헤쳐 온 것이,

어쩌면 그 단무지와 군만두를 알아가는 과정일 수도 있겠다.

 

그렇게 드디어, 이 기나긴 여정에도 마침표를 찍을 때가 온 것 같다.

초기 기획해두었던 목표 주제들도 모두 작성 완료했고,

다음 주에는 후기글을 작성해볼 예정이다.

 

 

내일은 짜장면 시켜먹어야지.

그럼, 이번 주도 끝!

 

 


 

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주차: 마무리 - 후기