
1. 項目概述一個為Unity游戲而生的“翻譯官”如果你是一名熱愛日系或獨立游戲的玩家或者是一名游戲漢化組的成員那么你一定對“游戲內文本翻譯”這個需求不陌生。面對那些沒有官方中文、文本又深嵌在游戲資源里的作品傳統的漢化方式往往意味著繁瑣的資源解包、文本提取、翻譯、再打包整個過程不僅技術門檻高而且一旦游戲更新漢化補丁就可能失效讓人頭疼不已。XUnity.AutoTranslator后文簡稱XUA的出現正是為了解決這個痛點。它不是一個簡單的文本替換工具而是一個運行在游戲進程內的、高度智能的翻譯插件。其核心思路是“運行時攔截與替換”在游戲運行時動態(tài)攔截Unity引擎渲染到屏幕上的每一段文本將其發(fā)送到配置好的翻譯服務如谷歌翻譯、百度翻譯等進行實時翻譯再將翻譯結果無縫替換回游戲界面。這意味著你無需修改游戲的任何原始文件就能實現“即開即用”的游戲內翻譯。對于玩家而言它降低了體驗外語游戲的門檻對于漢化者而言它提供了一套可編程、可擴展的現代化漢化框架。這個開源項目在GitHub上由bbepis維護其亮點遠不止“自動翻譯”四個字。它集成了資源重定向、字體替換、UI自適應、正則表達式處理、插件化翻譯端點等高級功能形成了一個功能強大且生態(tài)開放的解決方案。接下來我將從一個資深插件使用者和開發(fā)者的角度為你深度解析XUA那些令人印象深刻的亮點與核心機制。2. 核心架構與設計哲學不僅僅是“翻譯”2.1 運行時Hook與無侵入式修改XUA的基石是其強大的運行時Hook能力。它主要依賴于兩個底層庫Harmony或可選的MonoMod來實現對Unity引擎內部方法的攔截。當游戲調用諸如TextMeshPro.text或UnityEngine.UI.Text.text的setter屬性時XUA的代碼會搶先一步執(zhí)行。其工作流程可以簡化為檢測插件檢測到游戲試圖設置一段文本到UI組件上。攔截Hook方法捕獲這段原始文本例如日文“こんにちは”。查詢首先在本地翻譯緩存文件如_AutoGeneratedTranslations.txt中查找是否有現成的翻譯。翻譯若緩存未命中則根據配置將文本發(fā)送至指定的在線翻譯API如Google Translate。替換與渲染獲取翻譯結果如“你好”后將其設置回UI組件并觸發(fā)必要的UI更新如字體重載、文本框大小調整。緩存將新的翻譯對原始文本 - 翻譯文本寫入本地緩存文件供后續(xù)使用。這種設計的最大優(yōu)勢在于“無侵入性”。游戲本體文件保持原樣所有翻譯邏輯和緩存數據都存放在游戲目錄下的獨立文件夾如BepInEx/plugins/XUnity.AutoTranslator中。卸載插件只需刪除該文件夾游戲即刻恢復原狀。這完美解決了傳統漢化補丁與游戲版本強綁定、易沖突的問題。2.2 模塊化與生態(tài)擴展Resource Redirector的威力XUA不僅僅能處理動態(tài)文本其內置的**Resource Redirector資源重定向器**模塊是一個更具革命性的設計。它是一個獨立于自動翻譯功能的通用庫允許插件在游戲加載資源如AssetBundle、Resources文件夾中的資源的瞬間動態(tài)替換其內容。這意味著什么假設一個游戲的所有UI圖片、字體文件都打包在AssetBundle里。傳統漢化需要解包、修改圖片、重新打包。而利用Resource Redirector你可以配置插件啟用資源轉儲EnableTextureDumpingTrue。運行游戲插件會自動將游戲加載的所有紋理圖片以帶哈希值的文件名如button_icon [ABCD1234].png導出到指定目錄。你用PS等工具修改這些圖片例如將日文按鈕圖替換為中文。將修改后的圖片放回原目錄并啟用紋理翻譯EnableTextureTranslationTrue。再次運行游戲Resource Redirector會在游戲加載原始button_icon時攔截該請求并返回你修改后的中文圖片文件。這個過程完全在內存中完成無需替換游戲原始資源包。這個模塊的API甚至對其他插件開發(fā)者開放使得任何模組都可以利用它來安全地替換游戲內的音頻、模型、文本資產等極大地擴展了Unity游戲Mod的可能性邊界。2.3 配置驅動的靈活性XUA的另一個核心設計是高度的可配置性。幾乎所有的行為都由一個Config.ini文件控制。從選擇翻譯引擎、設置并發(fā)請求數、配置緩存路徑到精細控制空白符處理、UI重縮放策略、正則表達式規(guī)則都可以通過修改配置文件實現。這種設計將“使用”和“開發(fā)”清晰地分離開。普通用戶只需在GUI按Alt0呼出中選擇翻譯語言和端點或簡單修改幾個配置項而高級用戶和漢化組則可以通過編輯復雜的配置文件實現近乎定制化的翻譯行為例如為特定場景Level Scope或特定可執(zhí)行文件Exe Scope應用不同的翻譯規(guī)則或者使用正則表達式精準處理游戲內復雜的字符串拼接。3. 核心功能亮點深度剖析3.1 智能文本處理與緩存機制XUA的文本處理邏輯非常細膩考慮到了游戲開發(fā)中各種復雜的文本呈現情況。空白符與換行符的智能處理游戲文本中經常包含用于排版或對話控制的換行符\n、首尾空格等。直接將這些文本送去翻譯可能會導致翻譯API將換行前后的句子割裂處理產生糟糕的譯文。XUA的IgnoreWhitespaceInDialogue和ForceSplitTextAfterCharacters等配置項就是為了在發(fā)送翻譯前智能地清理和重組這些空白符確保送給翻譯引擎的是語義連貫的整句翻譯完成后再將必要的格式還原回去。四級文本查找策略為了提高緩存命中率和翻譯準確性XUA對一個待翻譯文本會進行四次遞進式查找原始文本。去除首尾空白符的文本。去除內部非重復空白符如環(huán)繞換行符的空格的文本。同時進行2和3處理的文本。例如對于文本\n「今日はいい天気ですね。」\n插件會嘗試查找「今日はいい天気ですね。」的翻譯。只要緩存中存在這個核心句子的翻譯無論其原始呈現時帶有什么樣的排版空白符都能被正確匹配并應用。這個設計極大地減少了重復翻譯和緩存冗余。翻譯作用域Scoping這是高級漢化的利器。通過#set level和#set exe等指令可以將特定的翻譯條目限定在特定的游戲場景或特定的游戲啟動程序下生效。這對于翻譯那些在不同場景中重復使用但含義不同的文本比如通用菜單項和特定劇情文本或者為游戲的不同版本如Steam版和DMM版提供差異化翻譯提供了完美的解決方案。3.2 強大的UI適配與字體管理自動翻譯最大的視覺挑戰(zhàn)之一是“文字溢出”。日文、中文等語言的字符寬度和排版習慣與英文不同直接替換后常導致文本超出文本框、顯示不全或重疊。自動與手動UI重縮放XUA提供了雙重解決方案。自動重縮放通過EnableUIResizing和ForceUIResizing插件可以嘗試自動調整Text或TextMeshPro組件的HorizontalOverflow、VerticalOverflow、FontSize等屬性讓長文本能夠換行或縮小顯示。手動精準控制通過創(chuàng)建resizer.txt文件你可以為游戲中特定的UI組件路徑指定精確的樣式命令。例如TitleScreen/Canvas/Panel/DescriptionTextChangeFontSizeByPercentage(0.85);UGUI_HorizontalOverflow(wrap)這行配置會找到路徑匹配TitleScreen/Canvas/Panel/DescriptionText的所有文本組件將其字體縮小至85%并將水平溢出模式改為自動換行。你可以使用開發(fā)者工具如Runtime Unity Editor或開啟EnableTextPathLogging來獲取游戲中每個文本組件的完整路徑。字體替換與回退許多游戲的默認字體不包含中文等字符集導致翻譯后顯示為方框□□□。XUA的OverrideFontTextMeshPro和FallbackFontTextMeshPro配置項允許你指定一個包含目標語言字符集的字體文件如.ttf或.asset格式的TextMeshPro字體資源。插件會加載這個字體并替換或作為回退字體應用到所有文本組件上確保所有字符都能正確渲染。3.3 正則表達式與文本替換引擎對于結構化的游戲文本如物品名稱屬性[攻擊力10] 鋼鐵長劍簡單的字面翻譯無法處理。XUA內置了完整的正則表達式支持分為兩種模式標準正則翻譯r:直接匹配并替換整個文本。適用于格式固定、需要整體處理的字符串。r:^獲得金 ([0-9]) G$獲得金錢 $1 G拆分器正則sr:這是更強大的功能。它先將復合文本拆分成多個部分分別翻譯再重新組合。這對于處理游戲動態(tài)拼接的文本尤其有效。sr:^([0-9]{2}) ([\S\s])$$1 $2假設游戲顯示01 ポーション01 藥水。上面的正則會將其拆分為01和ポーション。01作為數字不被翻譯ポーション被單獨查找翻譯緩存假設緩存中有ポーション藥水最后重組為01 藥水。這避免了為01 ポーション、02 ポーション等每一個變體都單獨創(chuàng)建翻譯條目的麻煩。預處理與后處理Substitutions你還可以創(chuàng)建_Substitutions.txt文件在文本被送去翻譯前進行簡單的查找替換。例如將總是被誤譯的角色名「アリス」替換為一個占位符{{ALICE}}這樣翻譯引擎就不會去翻譯這個名字翻譯完成后再將{{ALICE}}替換回「愛麗絲」。這保證了專有名詞翻譯的一致性。3.4 插件化翻譯端點與開發(fā)者生態(tài)XUA不僅是一個終端用戶工具更是一個開發(fā)平臺。它定義了ITranslateEndpoint接口允許開發(fā)者輕松集成任何翻譯服務。實現自定義翻譯器開發(fā)者只需創(chuàng)建一個繼承自HttpEndpoint或直接實現ITranslateEndpoint的類完成Initialize初始化API密鑰等、OnCreateRequest構建網絡請求、OnExtractTranslation解析響應幾個核心方法編譯成DLL后放入Translators文件夾該翻譯服務就會出現在插件的端點列表中。項目源碼中已經提供了Google、Bing、DeepL、百度、Yandex等主流翻譯的完整實現參考。這種設計意味著即使某個公共翻譯API開始收費或改變接口社區(qū)也能快速響應開發(fā)出新的適配端點甚至集成本地運行的機器翻譯模型如MarianMT實現完全離線的翻譯體驗。與其他Mod的互操作性XUA提供了API供其他Mod調用查詢翻譯AutoTranslator.Default.TranslateAsync。同時也提供了讓其他Mod“屏蔽”自動翻譯的機制在GameObject名稱中包含XUAIGNORE避免了Mod界面被錯誤翻譯的尷尬。對于IMGUI繪制的Mod界面則可以通過向XUA的GameObject發(fā)送DisableAutoTranslator/EnableAutoTranslator消息來臨時關閉翻譯確保自身UI的純凈。4. 高級配置與實戰(zhàn)技巧4.1 性能調優(yōu)與請求優(yōu)化自動翻譯插件在運行時進行網絡請求和文本處理不當配置可能影響游戲流暢度。批量處理Batching務必開啟EnableBatchingTrue。這會將短時間內產生的多個翻譯請求合并為一個請求發(fā)送給翻譯端點大幅減少網絡連接數。對于按請求次數收費的API這也能節(jié)省成本。字符數限制MaxCharactersPerTranslation默認值為1000切勿隨意調高。過長的文本如整本游戲說明書不僅翻譯質量差還可能觸發(fā)翻譯API的請求限制或導致超時。對于超長文本應考慮通過資源重定向直接替換整個TextAsset。緩存策略翻譯結果會優(yōu)先從本地的_AutoGeneratedTranslations.txt讀取。一個良好的實踐是在游玩一段時間后將這個文件備份并手動校對、潤色形成一個高質量的離線翻譯庫。下次游戲時將Endpoint設為空即可完全使用離線翻譯實現零延遲、零網絡依賴的完美體驗。紋理翻譯的權衡紋理替換功能強大但性能開銷大。TextureHashGenerationStrategy首選FromImageName僅在哈希沖突導致圖片錯亂時才嘗試FromImageData。CacheTexturesInMemoryTrue用內存換性能如果內存緊張可關閉。切記分發(fā)整合包時絕對不要開啟EnableTextureDumping、LoadUnmodifiedTextures等調試選項。4.2 疑難雜癥排查指南在實際使用中你可能會遇到各種問題以下是一些常見問題的排查思路問題翻譯不生效或時有時無。檢查按Alt0確認翻譯端點已正確選擇且在線。查看游戲目錄下的LogOutput.logBepInEx日志或插件控制臺是否有連接錯誤、認證失敗API密鑰錯誤或頻率限制的報錯。檢查確認游戲文本組件類型是否被支持。XUA主要支持UGUI Text、TextMeshPro、部分NGUI和IMGUI。對于非常規(guī)或自定義組件可能需要開啟EnableSpriteRendererHooking或TextGetterCompatibilityMode進行實驗性嘗試。檢查文本是否被插件忽略查看配置中的IgnoreTextStartingWith或檢查文本是否以不可見字符開頭。問題翻譯后游戲邏輯出錯或崩潰。嘗試啟用TextGetterCompatibilityModeTrue。有些游戲會讀取當前顯示的文本來決定后續(xù)劇情分支或邏輯直接替換文本會導致游戲讀取到翻譯后的內容而邏輯錯亂。此模式會“欺騙”游戲讓它仍然讀到原始文本。嘗試對于IL2CPP編譯的游戲翻譯支持可能不完整??梢試L試使用項目提供的AutoTranslator.IL2CPP.BruteForceFix輔助插件。問題翻譯后UI布局錯亂文字重疊或顯示不全。操作這是最常見的問題。首先嘗試開啟EnableUIResizingTrue。如果效果不佳則需要使用手動重縮放。操作開啟EnableTextPathLoggingTrue在游戲中觸發(fā)有問題的文本然后在日志中查找其完整路徑。根據路徑創(chuàng)建或修改resizer.txt文件為其指定合適的字體大小和溢出模式。操作如果翻譯目標語言是非拉丁字符如中文務必配置FallbackFontTextMeshPro指向一個包含該語言字符集的字體文件。問題特定Mod的界面被錯誤翻譯。解決找到該Mod生成的GameObject在其名稱中加入XUAIGNORE忽略該物體或XUAIGNORETREE忽略該物體及其所有子物體。解決如果Mod使用IMGUI且你是該Mod的開發(fā)者可以在你的OnGUI方法中用GameObject.Find(___XUnityAutoTranslator)?.SendMessage(DisableAutoTranslator)和SendMessage(EnableAutoTranslator)包裹你的繪制代碼。4.3 為特定游戲定制翻譯包當你打算為一個游戲制作并分發(fā)一個高質量的翻譯包時遵循以下流程可以事半功倍初始游玩與緩存生成正常安裝插件并游玩游戲讓插件自動生成_AutoGeneratedTranslations.txt。盡可能觸發(fā)所有游戲文本。離線翻譯與精校關閉在線翻譯使用CAT計算機輔助翻譯工具或文本編輯器對自動生成的翻譯文件進行人工校對、潤色和補全。這是一個耗時但提升體驗最關鍵的一步。處理圖片資源如果需要翻譯圖片UI開啟EnableTextureDumping和EnableTextureScanOnSceneLoad遍歷游戲所有場景導出所有紋理。用圖像軟件翻譯后關閉轉儲選項開啟EnableTextureTranslation。UI適配調整針對游戲中每個出現文字溢出或布局問題的UI使用EnableTextPathLogging找到路徑并在resizer.txt中編寫適配規(guī)則。這是一個細致活需要反復測試。整合與測試將校對后的文本文件、翻譯好的圖片、配置好的resizer.txt以及插件的核心DLL文件一起打包。確保配置文件中的調試選項如Dumping、Toggling已關閉MaxCharactersPerTranslation不超過400項目要求。分發(fā)說明在發(fā)布包中附帶清晰的README說明安裝方法、已知問題如某些場景翻譯缺失、以及如何反饋錯誤。5. 開發(fā)者視角擴展與集成5.1 實現一個簡單的自定義翻譯端點讓我們通過一個極簡的示例看看如何為XUA添加一個將文本反轉的“惡搞”翻譯器。這有助于理解插件端點的工作流程。首先你需要創(chuàng)建一個新的.NET類庫項目目標框架.NET 3.5或.NET Standard后者需修改csproj為net35以兼容舊版Unity。引用從XUA開發(fā)者包中獲取的XUnity.AutoTranslator.Plugin.Core.dll。using XUnity.AutoTranslator.Plugin.Core; using XUnity.AutoTranslator.Plugin.Core.Endpoints; using System.Collections; namespace MyCustomTranslator { public class ReverserEndpoint : ITranslateEndpoint { // 端點的唯一ID用于在配置文件中指定 [Endpoint] 節(jié) public string Id Reverser; // 在插件GUI中顯示的名稱 public string FriendlyName 文本反轉器; // 最大并發(fā)請求數對于本地端點可以設高 public int MaxConcurrency 10; // 每次請求最大翻譯文本數本例為簡單處理一次一個 public int MaxTranslationsPerRequest 1; // 初始化方法可以讀取配置 public void Initialize(IInitializationContext context) { // 可以從插件的Config.ini中讀取自定義配置節(jié) // bool mySetting context.GetOrCreateSetting(Reverser, MyConfig, true); // 這里我們不需要特殊配置 } // 核心翻譯方法 public IEnumerator Translate(ITranslationContext context) { // 獲取待翻譯文本 string original context.UntranslatedText; // 執(zhí)行“翻譯”將字符串反轉 char[] charArray original.ToCharArray(); System.Array.Reverse(charArray); string reversedText new string(charArray); // 調用Complete表示翻譯成功并傳入結果 context.Complete(reversedText); // 因為是即時完成的沒有異步操作所以返回null return null; } } }編譯后將生成的MyCustomTranslator.dll放入游戲的BepInEx/plugins/XUnity.AutoTranslator/Translators/目錄。重啟游戲在翻譯端點選擇列表中你就能看到“文本反轉器”選項。選擇它游戲內所有文本都會被反轉顯示。這個例子雖然簡單但清晰地展示了實現一個端點所需的全部要素ID、名稱、并發(fā)控制、初始化和翻譯邏輯。5.2 利用Resource Redirector進行資源替換假設我們想開發(fā)一個Mod將游戲內所有“藥水”的圖標替換成自定義的圖標。我們可以利用XUA內置的Resource Redirector庫來實現而無需依賴完整的AutoTranslator。首先在你的Mod插件項目中引用XUnity.Common.dll和XUnity.ResourceRedirector.dll。using UnityEngine; using XUnity.ResourceRedirector; public class MyPotionReplacerPlugin { public void Awake() { // 注冊資源加載后的回調后置鉤子 ResourceRedirection.RegisterAssetLoadedHook( HookBehaviour.OneCallbackPerResourceLoaded, 100, // 優(yōu)先級 OnAssetLoaded); } private void OnAssetLoaded(AssetLoadedContext context) { // 1. 檢查加載的資源類型是否為Texture2D圖片 if (!(context.Asset is Texture2D texture)) return; // 2. 獲取資源的唯一路徑標識用于判斷是否是我們要替換的資源 string assetPath context.GetUniqueFileSystemAssetPath(texture); // 3. 假設我們知道“藥水”圖標的內部路徑或名稱特征 // 這里用名稱包含potion作為示例實際中可能需要更精確的匹配 if (assetPath.ToLower().Contains(potion)) { // 4. 加載我們準備好的替換紋理 // 假設我們的替換圖片放在Mod目錄下的 Textures/my_cool_potion.png string modPath Path.Combine(Paths.PluginPath, MyPotionMod/Textures/my_cool_potion.png); if (File.Exists(modPath)) { byte[] fileData File.ReadAllBytes(modPath); Texture2D newTexture new Texture2D(2, 2); newTexture.LoadImage(fileData); // 自動識別PNG/JPG等格式 // 5. 替換資源 context.Asset newTexture; // 6. 通知Resource Redirector我們已完成處理并跳過后續(xù)的其他后置鉤子 context.Complete(skipRemainingPostfixes: true); Debug.Log($已替換藥水紋理: {assetPath}); } } // 如果不是我們要替換的資源什么都不做讓資源正常加載 } }這個Mod在游戲加載任何紋理資源時都會檢查如果路徑包含“potion”就用我們自定義的圖片替換它。Resource Redirector的API非常強大你可以在資源加載前Prefix就決定加載另一個文件也可以在加載后Postfix修改資源對象。這為游戲資源Mod開發(fā)打開了無限可能。6. 局限性與未來展望盡管XUnity.AutoTranslator功能強大但它并非萬能也存在一些固有的局限性。對IL2CPP的支持仍在完善IL2CPP是Unity的一種將C#代碼預編譯為C的先進后端能提升性能和安全性但也使得傳統的運行時代碼注入Hook變得困難。XUA對IL2CPP游戲的支持度相對Mono游戲要低例如TextGetterCompatibilityMode和IMGUI翻譯可能無法使用文本鉤子的穩(wěn)定性也可能稍差。雖然項目提供了BruteForceFix等輔助方案但兼容性仍需針對每個游戲進行測試和調整。性能與穩(wěn)定性權衡開啟紋理翻譯、全場景紋理掃描、高精度哈希計算FromImageData等功能會顯著增加內存和CPU開銷在配置較低的機器上可能導致卡頓。復雜的正則表達式和大量翻譯條目的實時匹配也會消耗計算資源。因此在追求完美翻譯和保持游戲流暢之間需要做出權衡。翻譯質量依賴外部服務其核心的自動翻譯質量完全取決于后端翻譯引擎Google、DeepL等。對于游戲特有的術語、俚語、文化梗機器翻譯往往力不從心甚至鬧出笑話。這也是為什么高質量的翻譯包離不開人工校對和創(chuàng)建大量“替換規(guī)則”Substitutions的原因。未來這個項目的發(fā)展方向可能會集中在對IL2CPP更好的原生支持隨著Unity新項目越來越多地使用IL2CPP社區(qū)對這方面穩(wěn)定性的需求會越來越強。集成本地大語言模型LLM隨著像Llama、Qwen等開源LLM模型在本地部署變得可行未來可能會出現直接調用本地LLM進行翻譯的端點在保護隱私的同時獲得比傳統統計機器翻譯更準確、更符合語境的譯文。更智能的上下文翻譯目前的翻譯基本是單句進行。如果能結合游戲對話歷史、角色信息等上下文翻譯質量有望進一步提升。這可能需要更深入的插件與游戲邏輯的集成。社區(qū)翻譯平臺集成或許未來能出現一個中心化的平臺玩家可以上傳和共享針對特定游戲的、經過人工校對的翻譯緩存文件_AutoGeneratedTranslations.txt甚至包括處理好的UI重縮放規(guī)則和紋理包形成真正的“即插即用”高質量翻譯社區(qū)生態(tài)。從我個人的使用經驗來看XUnity.AutoTranslator已經遠遠超出了一個“翻譯插件”的范疇。它是一個橋梁連接了玩家與外語游戲連接了Mod開發(fā)者與游戲內部資源更連接了自動化工具與人工精校的智慧。它的模塊化設計和開放的API使其成為了Unity游戲Modding領域的一個基礎設施級別的項目。無論你是想無障礙暢玩一款小眾佳作還是想為愛發(fā)電制作一個精良的漢化包亦或是想開發(fā)一個改變游戲資源的Mod深入理解并善用這個工具都將讓你事半功倍。