한글패치 관련 짧은 글들

유니티 게임 한글화 - SDF 폰트 교체

Snowyegret 2021. 7. 7. 13:49

예시 게임

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

-------

필요 프로그램 / 자료

UABE류 :UABE (https://github.com/DerPopo/UABE/releases)
:UAAE (https://github.com/Igor55x/UAAE/releases)
:UABEA (https://github.com/nesrak1/UABEA/releases)
  -UABE 사용방법이 어렵다면 UABEA를 사용하자. 본문의 경우 UABEA를 이용하여 진행하겠다.
  -UABE/UAAE/UABEA 3개 다 받을 필요는 없다. 필요에 따라 다운받자.
Asset
Studio
https://github.com/Perfare/AssetStudio/releases
(* 비공식 후속 버전: https://github.com/aelurum/AssetStudio)
(* 비공식 후속 버전의 경우 직접 빌드하거나, 이곳을 참고하여 빌드된 바이너리 다운.)
한글 리스트 :완성형 한글 2350자+특수기호+영문자
   (https://gist.github.com/taggon/a05af10cb9a38f201aefaacf3391e756)

:완성형 한글 2780자 (https://namu.wiki/w/완성형/한글 목록/Adobe-KR-9)
  -Adobe-KR-9의 경우 필요에 따라 특수기호/영문자/숫자 등등을 추가해야 한다.
에디터 :Visual Studio Code (https://code.visualstudio.com/)
:Notepad++ (https://notepad-plus-plus.org/downloads/)
(* 본문에선 VS Code로 진행하나, 다른 어떤 에디터를 사용하여도 무방.)
(선택) :UnityEX (https://forum.zoneofgames.ru/topic/36240-unityex/)
  -커맨드라인을 이용하여 작업하기 좋은 프로그램.
   search기능 및 일괄추출 기능이 강력하다.
   기본 버전은 유니티 2019 이하만 지원하며 유료 버전의 경우 가격이 상당하니 필요에 따라 사용하자.
:HxD와 같은 Hex Editor (https://mh-nexus.de/en/downloads.php?product=HxD20)

 

목차

1. 유니티 버전 파악 & 에디터 설치


2. 폰트 생김새 확인


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


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


5. 폰트 제작용 게임에서 폰트 텍스쳐, 좌표파일 추출


6. 좌표파일 수정


7. 텍스쳐 및 좌표파일 교체


8. 테스트

 

 

1. 유니티 버전 파악 & 에디터 설치

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

폰트 제작용 게임의 유니티 버전을 정하기 위해 알아두는 것이 좋다.

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

  -> 헥스 에디터를 통한 확인 시, 뒷부분은 자르고 "2019.4.19"까지만 알아두자.

  -> 마찬가지로 unityplayer.dll의 속성을 통해 확인 시에도 뒷부분은 자르고 "2019.4.19"까지만 알아두자.

 

게임 제작시 사용된 유니티 버전을 확인한 후, 해당 버전에 맞는 유니티 에디터를 설치하자.

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

 

 

 

 

2. 폰트 생김새 확인

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

어떤 폰트를 수정해야 하는지 알아보는 방법은 대략적으로 두가지가 있다.

눈으로 보고 때려맞추는 방법과, MelonLoader와 UnityExplorer를 통해 알아내는 방법.

 

 

 

- 눈으로 보고 때려맞추기

AssetStudio를 실행하고, 게임폴더를 통째로 프로그램 빈 창에 드랍한다.

오류가 뜬다면 그냥 확인을 누르거나, 구버전 AssetStudio를 사용하면 된다.

Asset List 탭으로 이동한 후, Filter Type을 Font로 바꾸면 게임에 사용된 일반폰트들이 보인다.

위 경우 Roboto 시리즈가 사용되었단 것을 알 수 있다.

 

 

 

이제 Filter Type을 Texture2D로 바꾼 후 SDF를 검색해 보면, SDF 폰트들이 나오게 된다.

동명의 일반폰트(TTF/OTF/UFNT)와 SDF폰트가 같이 있다면 SDF 폰트를 사용할 확률이 높은 것 같다.

* 사실 이 경우는 weight가 다른 동일 폰트를 여러 개 사용하므로, 눈을 통한 구분이 어려워 UnityExplorer를 사용하였다. 그러므로 아래 진행 할 내용은 변경을 원하는 폰트의 이름이 무엇인지 눈을 통해 구분했다고 가정하고 작성하겠다.

 

 

 

게임 메인화면에서 바꿔야 할 폰트가 Roboto-Bold SDF라는 것을 알았다.

Filter Type을 Texture2D/Monobehaviour로 각각 바꾼 후 나오는 항목의 "PathID"를 기억해두자.

위 경우는 561, 1968이다.

Texture2D는 SDF폰트의 텍스쳐를 알아보기 위해, MonoBehaviour는 좌표파일을 알아보기 위해 확인한다.

 

 

 

우클릭한 후 Show original File을 누르면 이 에셋이 어느 assets 파일에 있는지 알 수 있다.

Texture2D와 MonoBehaviour 모두 sharedassets0.assets에 있다고 한다.

* 만약 Select Assembly Folder 창이 뜬다면, Muck_Data\Managed 폴더를 선택하면 된다.

 

 

 

 

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

아까 확인했던 정보를 정리해보자면,

Roboto-Bold SDF 폰트의 텍스쳐 파일은 sharedassets0.assets 파일의 561번 에셋,

MonoBehaviour 파일(좌표파일)은 sharedassets0.assets 파일의 1968번 에셋이었다.

 

 

UABEA를 실행한 후, sharedassets0.assets을 불러온다.

이후, View - Go to asset - Path ID 1968 - 확인을 눌러 이동해주면 Roboto-SDF MonoBehaviour 파일이 선택된다.

우측 버튼 중 "Export Dump" 버튼을 눌러 좌표파일을 텍스트 파일로 추출하자.

 

 

 

 

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

구버전 Unity Hub

 

신버전 Unity Hub

 

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

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

신버전 Unity Hub: Project - New Project - All Templetes - 3D

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

 

 

 

제일 처음 뜨는 업데이트 체크 창은 "Skip new version"을 눌러 스킵하고,

 

 

 

<Importing>

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

폰트에 따라 Importing 과정이 매우 길 수도 있다.

 

 

 

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

 

 

 

뭔 이상한 창이 뜬다.

Source Font File은 아까 추가한 폰트를 선택하면 되지만, 나머지는 어떻게 해야 할지 막막하다.

그래서 아까 좌표파일을 추출해둔 것이다.

 

좌표파일 추출해둔 걸 텍스트 편집기로 연 후, creation을 검색한다.

원본 폰트가 만들어졌을 당시의 설정이 기록되어 있기에, 이걸 그대로 따라가면 좋다.

* 단, atlasWidth와 Height같은 것들은 한글 글자 수가 훨씬 많으므로 필연적으로 커질 수밖에 없으니 주의하자.

사실 다른건 볼 필요 없고, pointSize와 padding만 보면 된다.

원폰 폰트의 pointSize는 69, padding은 5이다.

 

 

 

그럼 위와 같은 설정값이 나오게 된다.

Atlas Resolution은 원하는 만큼 크게 해도 되고,

Character Set은 파일에서 가져오거나 직접 입력할 수 있지만 나는 위에 있는 2350자 텍스트파일을 이용하였다.

Render Mode는 개인 선호도에 따라 설정하면 되지만, 폰트 제작 시간 대비 퀄이 제일 좋은 건 SDFAA라고 생각한다.

도트의 경우 Raster를 사용하자.

힌팅은 일부 환경에서 훨씬 나은 결과를 가져다줄 수 있다.

 

 

 

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

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

 

* Missing Characters가 많다면 Atlas Size가 충분하지 않은 것이므로 늘리면 된다.

* 폰트에서 지원하지 않는 글자가 많을 떄에도 해당 오류가 뜨니 확인이 필요하다.

* Characters missing from font file:에 10번(Hex: A) 글자가 있다면 그건 줄바꿈이니 있던 없던 상관 없다.

 

 

 

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

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

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

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

이때 한글이 정상적으로 출력되어야 폰트가 제대로 만들어진 것이다.

 

 

 

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

폴더는 프로젝트 내 폴더가 아닌, 접근이 간편한 다른 곳으로 지정하자.

 

 

 

5. 폰트 제작용 게임에서 폰트 텍스쳐, 좌표파일추출

<Texture의 경우>
<MonoBehaviour의 경우>

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

Texture파일을 png로 추출하고, Monobehaviour파일을 txt로 추출한다.

 

 

 

 

6. 좌표파일 수정

<왼쪽: 원본 게임에서 추출한 좌표파일 / 오른쪽: 폰트용 게임에서 추출한 좌표파일>

# 본 작업에 들어가기 전 원본/수정본 MonoBehaviour 파일의 백업부터 진행하자!

 

백업 후 VSCode로 아까 원본 게임에서 dump한 MonoBehaviour 파일과

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

 

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

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

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

0 FaceInfo m_FaceInfo 이하 부분을 모두 드래그하여 잘라내기를 한 후(위 스크린샷에서 선택한 부분),

원본 게임 부분에 교체한 다음 저장하자.

 

 

 

<잘라내기 후 교체한 모습>

* 왼쪽 파일을 저장하고, 오른쪽 파일은 삭제해도 무방하다.

 

 

제작한 폰트의 좌표파일(위에서 작업한 파일)과 아까 백업해둔 원본 게임의 좌표파일을 Notepad++로 열고,

제작한 폰트의 좌표파일 m_PathID, m_FileID를 검색해서 수치를 원본과 동일하게 바꿔준다.

 

* 위 경우 원본 좌표파일의 2206번 줄 m_pathid가 561, 제작한 폰트의 54786번 줄 m_pathid가 4이므로

  우측의 4를 561로 수정한다.

* 기본적으로 같은 버전의 TextMeshPro를 사용할 경우 구조가 달라지지 않겠지만,

  만약 구조가 달라진다면 게임이 망가진다. 그러한 경우 수동으로 구조를 맞춰줄 필요가 있다.

 

 

 

7. 텍스쳐 및 좌표파일 교체

텍스쳐는 그대로 교체하면 되고, 좌표파일도 수정이 끝났으니 그대로 import하면 된다.

아까 확인해뒀던 정보를 기반으로 빠르게 에셋을 찾아가자.

Roboto-Bold SDF 폰트의 텍스쳐 파일은 sharedassets0.assets 파일의 561번 에셋,

MonoBehaviour 파일(좌표파일)은 sharedassets0.assets 파일의 1968번 에셋이었다.

 

 

 

<Texture 교체>
<3번에서 아까 추출해뒀던, 제작한 폰트의 텍스쳐를 선택하면 된다.>

텍스쳐 교체는 Plugins - Edit Texture - Load - 아까 추출했던 제작 폰트의 텍스쳐 선택 - Save를 누르면 된다.

 

 

 

<MonoBehaviour 교체>

좌표파일 교체는 Import Dump - 아까 작업했던 좌표파일 선택 - 열기를 누르면 된다.

 

 

수정이 끝났으면 File - Save를 눌러 바탕화면에 저장하고, 

UABEA를 종료한 후 저장한 파일을 게임 파일에 덮어씌우자.

 

 

8. 테스트

잘 나오나 실행해보면, 역시 잘 나온다.

일부러 차이점을 보여주기 위해 명조체로 작업하였다.