ETH官方钱包

前往
大廳
主題

翻譯Unity遊戲無法顯示中文、中文缺字□□□問題的解決方式(TMP中文化)

改也沒有用3 | 2025-02-10 07:54:00 | 巴幣 2 | 人氣 273

一、前言:

關於Unity日文遊戲的中文化,主要的方式有三種

第一種是外掛式翻譯,利用OCR之類的外掛程式,會在額外視窗顯示原文及翻譯中文
當然這種體驗相當糟糕,但沒有缺字問題,因為另開視窗是以你的OS來顯示的。

第二種是外嵌式翻譯,透過XUnity.Autotranslator,在遊戲原本的內容中,隨遊戲進行逐步替代中文
這也是大多數主流的方案,對翻譯人員來說功夫也比較小,但無可避免的會遇到缺字問題
通常使用的方案是 arialuni_sdf_u2018/2019,但這也不一定都能解決問題(因為TMP版本不同的問題)
加上使用後可能會有字體大小錯亂的問題
這種方式最大的缺點就是譯者要先跑過所有遊戲內容,才能取得原文,而且不能加快跳過訊息
加快跳過訊息,或者譯者沒跑完全部支線,那就會有漏翻的句子(變成智障機翻)
而且遊戲進行時,也要等一下才能看到文本被替換成中文。

第三種是內嵌式翻譯,透過AssetStudio、UABEA、dnSpy、ILSpy 解包原本遊戲資源
將遊戲文本翻譯為中文內容後,再回填回去,達成遊戲等同原生中文遊戲的效果
這也是遊戲體驗最佳的一種方案(但也是最累死人的方案)
也和第二種方式一樣,無可避免會遇到缺字問題(缺字顯示為□□□)

本篇文章的目的,就是介紹透過我個人打包好的中文 TMP 字型
透過下面修改內容的方式,匯回遊戲後,來解決缺字問題(□□□)
當然不一定只能透過我打包的中文 TMP 字型,若有其他人或自行有能力打包者,處理方式也是一樣的
這種將 TMP 字型改為中文的方式,不但能適用第三種內嵌式翻譯,同樣也能適用第二種的外嵌翻譯


二、工具:

本篇文章並不說明翻譯部份的問題、上述各工具的操作問題,
並假設各位對 Unity 資源處理工具 UABEA 有一定的操作知識下,
來介紹關於遊戲內原本的日文 TMP 字型,替換為中文 TMP 字型的流程及概念。

所需工具:
1.UABEA(資源包處理工具)
2.我個人打包的源泉圓體繁體TMP字型,含常用7684字:GenSenRounded2TW7684.7z(MEGA)
 含:常用繁體中文、英數字、日文平片假、部份日文漢字、少量簡體中文、標點符號、表情符號
3.熟悉的文書處理軟體:Notepad++、UltraEdit 均可,沒有就記事本也行


三、觀念:

所謂的 TMP 字型是什麼?
TMP 字型在 Unity 其實就是一種預先畫好的一種字型資源,透過 TextMesh Pro 這個插件產生/使用
遊戲開發商可以預先做好各種藝術字體輪廓,在遊戲中就能直接使用,而不用重新動態即時產生。
TMP 就是 TextMesh Pro 的簡稱,開發 TMP 插件的原本是第三方廠商,後來已經被 Unity 買下內建。
(但是有個很致命的缺點就是 TextMesh Pro 並不完全向上/向下相容)

Unity 遊戲中,一個 TMP 字型,必定會包含兩個檔案:
1.字體名稱 Atlas(Texture2D/PNG)
一張含所有預先繪製好的字體輪廓的PNG檔,就是畫好N個字的形狀,放在這張巨大PNG檔之中
例如,某個TMP字型打包了1000字,那麼PNG圖檔裡面,就應該要畫出這1000個字的形狀。
2.字體名稱(MonoBehaviour/TXT)
一個資源描述文本檔,內容其實就是切割出每個文字在PNG中的指定座標位置
並紀錄這個字體的名稱、基本屬性、GUID、路徑等等,讓遊戲運行時能夠取用
沒有包含在這資源描述檔的文字,就會被 Unity 顯示為 □□□,也就是所謂的缺字。

我打包的源泉圓體繁體 TMP 字型,壓縮檔解開後包含兩個檔:
1.GenSenRounded2TW7684-R SDF Atlas-sharedassets0.assets-3.png
2.GenSenRounded2TW7684-R SDF-sharedassets0.assets-6.txt
(我打包的 TMP 字型是基於 TMP 3.0.0 的版本,基本上 TMP 1.4.0 之後的遊戲應該都適用)

所謂的替換 TMP 字型,將日文字型替換為中文字型
說穿了就是保留原本遊戲的日文 TMP 字型資源檔的基本內容(GUID、名稱、路徑等)
然後將 PNG 圖檔、以及切割每個文字索引的 TXT 資源檔,替換成新的內容(中文的內容)
讓遊戲在執行顯示中文文本時,可以根據新的資源檔,去正確切割 PNG 內的中文文字來使用。
(就是掛羊頭賣狗肉,掛日文 TMP 字型這個羊頭,賣的是中文 TMP 字型這個狗肉)

Texture2D/PNG(Altas) 檔的處理方式沒有什麼特別的,就只是拿產製好的PNG檔,
匯入回去替代掉原本日文字體的PNG檔而已

MonoBehaviour/TXT 檔的處理就是最大的難處,要保留基本資料、格式外
並將裡面的字體索引換成我產製的 MonoBehaviour 檔的內容
因此並不是簡單抽換掉幾行就沒事,說到底也有可能因為遊戲 TMP 版本的不相容
導致打包的 MonoBehaviour 格式並不符合該遊戲 TMP 版本所能處理的範圍

(最糟糕的情況是用 Unity Studio 重新參考遊戲及TMP版本,創建一個新的遊戲專案
重新打包一份 TMP 字型,並在建置後,透過 UABEA 匯出 TMP 字型來使用。
但整個步驟很繁瑣,電腦設備不好或打包字體太多,有可能要跑上好幾小時甚至好幾天)


四、處理步驟:

以下以 なぜかぼっちのマチルダさん 這個遊戲為範例

1.匯出原本日文 TMP 字型資源:

首先,需要將遊戲中,原本的日文 TMP 字型完全匯出並備份,也就是 PNG 和 TXT 都要匯出
一來是萬一處理失敗,還能100%還原回去原本的日文字型
二來是處理的過程中,原本日文 TMP 字型的資源描述檔,本來就是必要的

透過 UABEA 打開 sharedassets2.assets 這個資源包後(每個 level、sharedassets 資源包都要檢查)
可以發現這個資源包裡面至少就有這一堆 TMP 字型
(26140 SDF、35677 SDF、35677_2SDF、35677_2SDFBlue、35677_2SDFWhite...等等)
※Texture2D/PNG,需要用 Plugins → Export texture(或 Batch export textures) 來匯出
※MonoBehaviour/TXT,需要用 Export Dump 來匯出

透過 UABEA 匯出的檔案,會正確標記資源包編號、路徑(物件)編號
例如下圖 26140 字型,就是 sharedassets2 的路徑 101 以及 路徑 326(請對照上圖去看)
這些編號會在匯入回去時,幫助你確認是否是正確的物件對象,
也可用於批次匯入時,讓 UABEA 用來自動判斷用。
(上圖是本遊戲所有的 TMP 字型,都要替換掉,總共 12 套日文 TMP 字型)

2.將中文 TMP 字型的TXT,依照日文字型的數量複製並更名:

這個目的是因為,我們要以 中文字型檔編輯的基礎上,把 日文字型檔基本內容複製過來併入

為了方便知道是併入那一個日文檔,以及後續匯回使用,所以才要用該日文檔的名稱
所以一般來說,我會放到一個新的資料夾,來和日文原檔作為區別。
如果檔案不多或個人癖好不同,也可以無視這種方式,
主要是各位要知道你在編輯哪個中文字型檔,是併入哪一個日文字型檔,到時你要匯回到哪個檔裡面。

3.處理複製後的中文 MonoBehaviour TXT 檔:

以 26140 SDF 作為演示,為了容易區分,這邊還是使用原本的檔名。
(左側、複製來源)日文原檔:26140 SDF-sharedassets2.assets-326.txt
(右側、編輯對象)中文新檔:GenSenRounded2TW7684-R SDF-sharedassets0.assets-6.txt

STEP 1. 前 24 行完整取代:
就是日文檔的最前面24行基本資料、路徑編號等,直接替換過去

STEP 2. 所有 GUID 取代:
搜索 GUID,將日文檔的 GUID 值全部替換過去,GUID 值不多,應該總共4個。

STEP 3. PathID 取代:
PathID 會有上萬個,不能每個都取代,我只取代一個。
搜索:1 UInt8 m_IsMultiAtlasTexturesEnabled = 0
往回推兩行的 PathID,用左邊的 101 替換掉右邊的 3
(細心的人會發現,這個物件編號101,其實就是對應 26140 Atlas PNG 的物件編號101)

STEP 4. 其他檢驗:
其實這是匯入之後的測試與修正,先提前拿到這邊來說

前面步驟做完後,其實就要進入匯入遊戲的測試,但匯入回去後不見得能正常運作或不理想
此時就需要重新檢查日文原檔和中文新檔的差異(就是看屬性字串的差異度)
尤其是在於 Array 中的每個 item 的屬性是不是都有(可以從 Array 中挑幾個 item 檢查即可)
例如新版 TMP 可能多一些屬性字串或少一些屬性,那就要修正中文新檔,看是補上或移除屬性字串。

以這個遊戲來說,匯入回去後可以正常運作,但發現中文字的字體行高太小,導致字會疊在一起
比對後發現日文原檔設定的行高是188,於是中文新檔我將72設為144,後來跑出來的效果也還可以
因此,這個檢驗步驟,很大機率上是依各遊戲而不同。

4.匯回遊戲進行測試:

將處理過後的中文新檔、中文PNG檔,匯回遊戲,來檢查遊戲是否可以運作,以及顯示效果。

處理方式和匯出是一樣的原則。
※Texture2D/PNG,需要用 Plugins → Edit texture Ok Load Save 來匯入
(或 Plugins batch import textures)
由於這只是PNG檔,只要正確匯入一次即可,沒有什麼問題,
之後就算重複多次修改 TXT 檔,也不用再次重新匯入 PNG 檔

※MonoBehaviour/TXT,需要用 Import Dump 來匯入
這個檔案可能會因為修正(例如我後來有改行高),而需要重複匯入

以本遊戲來說,總共有 12 個 TMP 字型資源。
可以選擇先做完一個 TMP 就匯入回去試試看(但遊戲如果沒跑到用那個字體的話,就無法看到效果)
也可以全部做完一起整批匯入回去,但這樣檔名、編號的正確性就很重要,否則 UABEA 會無法自動對上
當然,UAEBA整批匯入,是不能混搭 PNG 和 TXT 同時進行的。

相關創作

更多創作