한글패치 관련 짧은 글

유니티 게임 SDF 폰트 변경 (muck)

눈백로 2021. 7. 7. 13:49

예시 게임

:Muck (https://store.steampowered.com/app/1625450/Muck/)

-------

필요 프로그램 / 자료

:UABE(https://github.com/DerPopo/UABE/releases)

:UAAE(https://github.com/Igor55x/UAAE/releases)

:UABEA(https://github.com/nesrak1/UABEA/releases)

  -UABE가 U3.4.0f5~2019.2.0f1까지만을 지원하니, 이후에 만들어진 게임이라면 UAAE나 UABEA를 사용하자.

  -UABE/UAAE/UABEA 3개 다 받을 필요는 없다. 필요한 것에 따라 다운받자.

:UnityEX (https://forum.zoneofgames.ru/topic/36240-unityex/)

:게임 제작시 사용된 유니티 버전 (https://unity3d.com/get-unity/download/archive) - 본문 참조

:완성형 한글 2350자+특수기호+영문자 (https://gist.github.com/taggon/a05af10cb9a38f201aefaacf3391e756)

:완성형 한글 2780자 (https://namu.wiki/w/완성형/한글 목록/Adobe-KR-9)

:HxD와 같은 Hex editor (필요시)

:Visual Studio Code

-------

목차

1. 유니티 버전 파악
2. 폰트 생김새 확인
3. 원본폰트 좌표파일(MonoBehaviour) dump
4. 폰트용 유니티 게임 빌드(SDF폰트 제작)
5. 폰트 제작용 게임에서 폰트 텍스쳐 추출, 원본 게임에 삽입
6. 폰트 제작용 게임에서 폰트 좌표파일 추출, 수정, 원본 게임에 삽입

-------

 

1. 유니티 버전 파악

우선, 원본 게임 제작에 사용된 유니티 버전을 알아보자.

폰트 제작용 게임의 유니티 버전을 정하기 위해 꼭 알아둬야 한다.

에셋파일을 헥스 에디터로 열어보거나, 최상위 디렉토리의 unityplayer.dll 속성을 확인하면 알 수 있다.

  -> unityplayer.dll의 속성을 통해 확인 시, 2019.4.19까지만 알아두자.

 

 

 

2. 폰트 생김새 확인

수정하고자 하는 폰트의 생김새를 확인한다.

* 2019년도 이전 유니티로 만들어진 게임의 경우, UnityEX와 bat파일을 통해 쉽게 찾을 수 있다.

* UnityExplorer라는 모드를 통해 찾는 방법도 있으나, 일단 패스하겠다.

* AssetStudio를 통해 찾아도 좋다.

* UnityExplorer 혹은 AssetStudio로 무슨 폰트를 수정해야 할 지 파악했다면, 모든 폰트를 찾은 후 선별하는 과정은 필요없다.

 

 

 

{게임이름}_data 폴더 내의 에셋 파일들(Resources, sharedassets0~, level0~...)을 열어 폰트들을 찾아보자.
Type을 보면 Texture2D, Material, MonoBehaviour...수없이 많지만

작업 시 필요한 것은 텍스쳐인 Texture2D파일과

폰트파일의 정보가 담겨있는 MonoBehaviour파일이다. (흔히 MB, MB파일, 좌표파일이라고 이야기 함)

 

SDF폰트는 대부분 Name 부분을 보면 "SDF"라는 단어가 들어가 있다.

UABEA의 상단 메뉴 중 View -> Search -> *SDF*를 검색하면 편하게 찾을 수 있을 것이다.

한번에 Texture2D가 검색되지 않을 경우, F3키를 눌러 계속 검색을 진행하자.

 

이 게임의 경우 Roboto SDF폰트인데, Thin이랑 Regular가 있으니 bold같은 다른 꼴도 있을 거라 예상하고,

상단 Name을 눌러 재정렬한다.

 

 

 

7개나 있다.

일단 UnityEX를 통해 폰트 텍스쳐 추출을 해보자.

창을 늘리지 않아 잘 보이지 않으나, 상단의 PathID를 보면

폰트 Texture2D의 PathID값은 549, 550, 548, 173, 172, 18, 17인 것을 볼 수 있다.

항상 폰트 텍스쳐의 PathID와 MB의 PathID를 기록해두는 습관을 들이자. 당장 안써도 언젠가 쓴다.

* UnityEX가 없거나, 지원하는 버전이 아니라면 UABEA의 Plugins 메뉴를 통해 텍스쳐 추출/삽입이 가능하다.

* 그러한 경우 아래 텍스쳐 삽입 파트를 UnityEX가 아닌 UABEA에서 진행하면 된다.

 

 

 

UABE를 종료 후, UnityEX로 파일을 열어본다.

이 게임의 경우 폰트 2개는 resources.assets에, 5개는 sharedassets0.assets에 들어있었다.

선택 후 export with convert or raw를 눌러 추출한다.

* UABEA에서 추출시 Plugins -> Export .png -> 저장

* UABEA에서 삽입시 Plugins -> Edit Texture -> Load -> 파일 선택 -> Save

 

추출한 dds파일들을 꿀뷰같은 이미지 뷰어를 통해 확인해보면

어떤 폰트가 게임에서 사용되며, 교체해야 하는지 파악이 가능하다.

게임에서 사용하는 폰트와 모양이 동일한 거로 보아, Roboto 시리즈를 건드려야 함이 확실해졌다.

 

 

 

3. 원본폰트 좌표파일(MonoBehaviour) dump

UnityEX 종료 후 다시 UABE를 열어 폰트 관련 정보가 담겨있는 MonoBehaviour 파일을 txt로 dump해보자.

7개의 MonoBehaviour 파일을 선택 후, export dump를 하면 된다.

 

 

 

성공했다면 좌표파일이 모두 추출되었을 것이다.

 

 

4. 폰트용 유니티 게임 빌드(SDF폰트 제작)

이제 한글 폰트를 만들어야 한다.

https://unity3d.com/get-unity/download/archive

게임 버전에 맞는 유니티 다운로드 후, 설치하고 실행한다.

프로젝트->새로 생성 우측 화살표 아이콘 (없을 땐 그냥 새로 생성 클릭) -> 해당 버전 클릭

프로젝트 이름은 아무거나 해도 상관없다. 이후 생성을 누르면 유니티 창이 뜬다.

 

 

 

Assets 디렉토리 빈 곳에다 만들고자 하는 폰트의 ttf 파일을 끌어다 놓는다.

그럼 importing 창이 뜨며 로딩이 된다.

 

 

 

Window -> TextMeshPro -> Font Asset Creator 버튼을 클릭하고, Import TMP Essentials를 클릭한다.

 

 

 

Source Font File 우측의 원모양 버튼을 클릭 후, 아까 import시킨 폰트를 선택한다. (이 경우 NanumGothic)

sampling point size, padding은 되도록이면 원본대로 만들자.

* 원본 폰트의 정보는 아까 MonoBehaviour에서 추출한 txt파일을 열어서 Creation을 검색해 보면 바로 나온다.

* Creation에 없을 경우 0 FaceInfo m_FaceInfo, 0 FaceInfo_Legacy m_fontInfo를 확인하고, 그래도 없다면 point, padd 등으로 검색하자.

Packing Method는 일단 fast로 설정하고,

Atlas Resolution은 원본 sampling point를 따라가려면 분명 모자랄 것이다. 필요한 대로 넓게 설정하자.

Render Mode는 SDFAA_hinted로 하는 것이 빠르고 깔끔하며, 도트 글꼴의 경우 Raster로 하는 것을 추천한다.

Character Set은 상단부 <필요 프로그램>을 참고하여, 한글 2350자 혹은 Adobe-KR-9 2780자를 토대로 만들자.

 

 

 

Generate Font Atlas를 누르면 위와 같이 만들어진 폰트 미리보기가 나오고,

정상적으로 만들어졌다면 Save를 눌러 저장한다.

 

 

 

Game Object -> Text - TextMeshPro를 누른 후,

유니티 창의 우측 부분을 보면 <TextMeshPro> 파트가 있다.

Text Input 박스를 누른 후 대충 한글을 써 보고,

바로 아래 있는 Font Asset 우측 동그란 버튼을 클릭하여 만든 폰트로 변경한다.

 

 

 

정상 출력되는지 확인 후, Build And Run을 클릭하여 실행 후에도 정상 출력되는지 확인한다.

 

 

 

5. 폰트 제작용 게임에서 폰트 텍스쳐 추출, 원본 게임에 삽입

폰트 추출용으로 새로 만든 게임의 sharedassets0.assets을 UABE와 UnityEX를 통해 열어서

아까 했던 방법대로 Texture파일과 Monobehaviour txt dump파일을 추출한다.

 

 

 

빌드한 게임에서 추출한 폰트 텍스쳐 파일의 이름을 원본 폰트의 텍스쳐 파일명대로 수정한다.

사실 bold체, italic체, light 등등 각기 다르게 만들어야 하지만,

어차피 같은 과정의 반복이고, 테스트기 때문에 생략하고 전부 한 폰트로 밀도록 하겠다.

덮어씌웠다면 UnityEX에서 import를 눌러 적용을 마친다.

적용을 마쳤다면 텍스쳐 작업은 이제 끝났다. UnityEX를 더 이상 쓰지 않아도 무방하다.

* 앞서 말했듯, UABEA로 작업할 경우 텍스쳐 파일의 이름을 변경할 필요가 없다. 그냥 Load해서 넣으면 된다.

 

 

 

6. 폰트 제작용 게임에서 폰트 MonoBehaviour 추출, 수정, 원본 게임에 삽입

# 일단 원본/수정본 MonoBehaviour 파일의 백업부터 진행하자

 

백업 후 VS Code로 아까 dump한 MonoBehaviour 파일과

새로 빌드한 폰트용 게임에서 dump한 MonoBehaviour 파일을 열어보자.

 

Ctrl+K 후 0을 누르면 모두 접힌다. (혹은 빈 공간 우클릭 -> command palette -> fold all 클릭)

접은 후 좌측 줄번호가 있는 부분에서 > 기호를 클릭하면 트리가 한 단계 열린다.

0 MonoBehaviour Base 상태에서 딱 한 단계만 열면 위와 같은 상태가 되는데,

0 FaceInfo m_FaceInfo 이하 부분을 모두 드래그하여 (위 스크린샷에서 선택한 부분)

새로 빌드한 게임 -> 원본 게임으로 교체한 후 저장하자. 

 

 

 

저장한 후 Notepad++로 GUID, m_PathID, m_FileID를 검색해서

아까 백업해둔 원본 게임 MonoBehaviour의 GUID, m_PathID, m_FileID 내용과 동일하게 바꾸고,

전체적인 구조를 원본과 동일하게 바꿔준다.

위 경우, 원본의 PathID값이 784이며 아까 작업한 MonoBehaviour파일의 PathID값이 4이므로, 4를 784로 바꿔준다.

* 기본적으로 같은 버전의 TextMeshPro를 사용할 경우 구조가 달라지지 않겠지만, 구조가 달라진다면 게임이 망가진다. 그러한 경우 수동으로 구조를 맞춰줄 필요가 있다.

 

 

 

MonoBehaviour를 모두 선택 후 import dump를 클릭한다.

이후 아까 수정한 txt파일들을 저장했던 폴더를 선택하면 일괄적으로 불러오기가 된다.

수정한 파일들의 우측 "Modified"열 값이 *이 되었는지 확인하고, 상단 좌측 File -> save를 눌러 다른 폴더에 저장한다.

위 경우 resources.assets 파일을 열고 수정하였지만, 연결된 파일들이 있기에 모두 저장된다.

UABEA, UnityEX같은 툴들을 모두 종료한 후, 저장된 게임파일들을 게임 파일에 덮어씌우고 테스트해보자.

 

 

 

만약 Save를 눌렀는데 저장하라는 창이 뜨지 않는다면, AssetsInfo 창을 끄고 UABEA 윈도우에서 Save를 누르자.

 

 

 

7. 테스트

원본 폰트가 bold체이나, 내가 폰트를 만들 때 각각 다르게 만들지 않아 깨져 보이는 것처럼 보이지만

어쨌건 글꼴 변경에 성공했다.