유니티 게임 한글화 - SDF 폰트 교체
예시 게임
: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) |
목차
3. 원본폰트 좌표파일(MonoBehaviour) dump
5. 폰트 제작용 게임에서 폰트 텍스쳐, 좌표파일 추출
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: Project - New Project - All Templetes - 3D
프로젝트 이름은 아무거나 해도 상관없다. 이후 생성을 누르면 유니티 창이 뜬다.
제일 처음 뜨는 업데이트 체크 창은 "Skip new version"을 눌러 스킵하고,
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. 폰트 제작용 게임에서 폰트 텍스쳐, 좌표파일추출
폰트 추출용으로 새로 만든 게임의 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번 에셋이었다.
텍스쳐 교체는 Plugins - Edit Texture - Load - 아까 추출했던 제작 폰트의 텍스쳐 선택 - Save를 누르면 된다.
좌표파일 교체는 Import Dump - 아까 작업했던 좌표파일 선택 - 열기를 누르면 된다.
수정이 끝났으면 File - Save를 눌러 바탕화면에 저장하고,
UABEA를 종료한 후 저장한 파일을 게임 파일에 덮어씌우자.
8. 테스트
잘 나오나 실행해보면, 역시 잘 나온다.
일부러 차이점을 보여주기 위해 명조체로 작업하였다.