前言
- Unity的多語言本地化是一個(gè)很實(shí)用的功能,它可以幫助游戲支持多種語言,讓不同語言的玩家都能夠更好地體驗(yàn)游戲。
- 而實(shí)現(xiàn)本地化的方案也有很多種,各個(gè)方案之間也各有優(yōu)劣,后面也會(huì)對(duì)多個(gè)方案進(jìn)行介紹學(xué)習(xí)。
- 本文就來介紹一個(gè)專門作用于多語言本地化的Unity官方插件:
Localization
。 - 這個(gè)插件方便進(jìn)行游戲的多語言本地化,讓游戲支持多種語言,下面就來看看該插件的使用方法吧!
【Unity 實(shí)用工具篇】| 游戲多語言解決方案,官方插件Localization 實(shí)現(xiàn)本地化及多種語言切換
一、多語言本地化插件 Localization
1.1 介紹
Localization
是Unity官方推出的本地化插件,它可以幫助開發(fā)者在Unity項(xiàng)目中實(shí)現(xiàn)多語言支持。
在Unity中,Localization的工作原理是創(chuàng)建多個(gè)表格來存儲(chǔ)不同語言的不同字符串。
可以通過Localization Tables創(chuàng)建這些表格,表格可以建立不同資源之間的對(duì)應(yīng)關(guān)系,一個(gè)key對(duì)應(yīng)多個(gè)語言的資源。
通過使用Localization插件,開發(fā)者可以方便地設(shè)置和獲取當(dāng)前語言和當(dāng)前語言地區(qū),從而為游戲或應(yīng)用程序提供多種語言的支持。
這對(duì)于那些需要面向不同地區(qū)和不同語言的用戶發(fā)布游戲或應(yīng)用程序的開發(fā)者來說是非常有用的。
1.2 效果展示
1.3 使用說明
官方文檔:官方文檔
本文使用的Localization版本為1.4.5,Unity引擎版本為2023.1.9。
后續(xù)插件可能會(huì)有更新,或者使用老版本的插件時(shí)功能使用上可能會(huì)有所不同,實(shí)際使用時(shí)按照自己的版本要求即可。
二、 插件導(dǎo)入并配置
2.1 安裝 Localization
打開菜單欄 Window -> Package Manager
,在搜索框中搜索Localization 并進(jìn)行安裝即可。
要注意Packages選擇Unity Registry,不然可能搜不到該插件哦。
2.2 全局配置
打開菜單欄 Edit -> Project Settings -> Localization -> Create
,找到Localization,點(diǎn)擊Create創(chuàng)建,并選擇一個(gè)文件目錄進(jìn)行文件保存。
點(diǎn)擊 Locale Generator
搜索zh和en添加中英文配置,第一次添加時(shí)會(huì)讓我們選擇一個(gè)文件夾目錄保存。
Locale Generator 用于添加或移出語言,每添加一種語言也會(huì)生成對(duì)應(yīng)的配置文件,然后可以修改默認(rèn)語言為中文,如下圖所示:
三、多語言映射表
3.1 創(chuàng)建多語言文本配置表
打開菜單欄 Window -> Asset Management -> Localization Tables
,點(diǎn)擊New Table Collection創(chuàng)建表格。
該表格用于建立不同資源之間的對(duì)應(yīng)關(guān)系,一個(gè)key對(duì)應(yīng)多個(gè)語言的資源,可以選擇創(chuàng)建文本表或者資源表。
這里我們選擇文本表(String Table Collection)使用,寫好表名后點(diǎn)擊Create就可以創(chuàng)建了,然后選擇一個(gè)路徑目錄進(jìn)行保存。
經(jīng)過上面幾個(gè)配置后可以在我們前面保存文件的路徑下看到相關(guān)的文件,這里最好是根據(jù)自己的情況選擇合適的文件夾進(jìn)行管理保存。
3.2 添加多語言文本配置表內(nèi)容
此時(shí)在Localization Tables中添加多語言文本即可,配置內(nèi)容主要是Key和對(duì)應(yīng)多種語言的文本。
可通過Window -> Asset Management -> Localization Tables
打開該窗口。
實(shí)際項(xiàng)目中不一定將多語言內(nèi)容全部寫在一個(gè)配置表中,不同的文本內(nèi)容也可以通過創(chuàng)建多個(gè)配置表進(jìn)行填寫,讓不同的模塊自己管理文本內(nèi)容也是一個(gè)不錯(cuò)的選擇。
3.3 靜態(tài)文本
此時(shí)在場(chǎng)景中添加一個(gè)文本組件Text,然后在該組件右側(cè)菜單處點(diǎn)擊Localize
,會(huì)自動(dòng)添加一個(gè)Localize String Event
組件。
(這里也可以手動(dòng)在下面添加Localize String Event
組件,不過還要手動(dòng)配置該組件綁定的Text組件,稍微麻煩一些,功能都是一樣的)
此時(shí)在該組件中的String Reference參數(shù)中選擇之前配置的多語言文本配置表中的Key即可完成多語言的配置。
此時(shí)運(yùn)行程序,可以看到該Text組件的文本內(nèi)容已經(jīng)變成我們配置多語言文本配置表中的Key對(duì)應(yīng)的文本了。
通過Game視圖右上角的語言選擇可以切換語種,點(diǎn)擊切換不同語言后,Game視圖中的文本也會(huì)即時(shí)的跟著切換了。
這樣我們的靜態(tài)文本就可以通過這種方法來添加多語言文本配置表中的Key綁定多語言了。
也可以通過腳本控制語言的切換,測(cè)試代碼如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.ResourceManagement.AsyncOperations;
public class LanguageManager : MonoBehaviour
{
AsyncOperationHandle m_InitializeOperation;
private Locale _chineseLocale;
private Locale _englishLocale;
void Start()
{
// SelectedLocaleAsync will ensure that the locales have been initialized and a locale has been selected.
m_InitializeOperation = LocalizationSettings.SelectedLocaleAsync;
if (m_InitializeOperation.IsDone)
{
InitializeCompleted(m_InitializeOperation);
}
else
{
m_InitializeOperation.Completed += InitializeCompleted;
}
}
void InitializeCompleted(AsyncOperationHandle obj)
{
var locales = LocalizationSettings.AvailableLocales.Locales;
for (int i = 0; i < locales.Count; ++i)
{
var locale = locales[i];
if (locale.LocaleName == "Chinese (Simplified) (zh)")
{
_chineseLocale = locale;
}
else if (locale.LocaleName == "English (en)")
{
_englishLocale = locale;
}
}
}
public void SwitchChinese()
{
LocalizationSettings.Instance.SetSelectedLocale(_chineseLocale);
}
public void SwitchEnglish()
{
LocalizationSettings.Instance.SetSelectedLocale(_englishLocale);
}
}
將該腳本掛載到場(chǎng)景中,并在場(chǎng)景中添加兩個(gè)Button分別綁定切換中英文的方法即可。
上述腳本代碼也可以換成下方這種,更簡(jiǎn)單粗暴的方法切換語言。
using UnityEngine;
using UnityEngine.Localization.Settings;
public class LanguageManager : MonoBehaviour
{
public void SwitchChinese()
{
LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[0];
}
public void SwitchEnglish()
{
LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[1];
}
}
索引值為L(zhǎng)ocalization 的配置項(xiàng)中的多種語言的順序,如下方第一個(gè)語言為中文則索引為0。
3.2 動(dòng)態(tài)文本
除了可以設(shè)置靜態(tài)文本,也可以在代碼中獲取對(duì)應(yīng)的文本并進(jìn)行動(dòng)態(tài)設(shè)置,下面看一下動(dòng)態(tài)文本的設(shè)置方法。
設(shè)置動(dòng)態(tài)文本的方法有很多種,可以看情況選擇,具體原理可以在官方文檔仔細(xì)查閱,這里就直接寫幾種方法的使用示例。
1.最簡(jiǎn)單粗暴的方法,直接動(dòng)態(tài)讀表賦值。
using UnityEngine;
using UnityEngine.Localization.Settings;
using UnityEngine.UI;
public class TestLocalization : MonoBehaviour
{
public Text text;
void Start()
{
var loadingResult = LocalizationSettings.StringDatabase.GetTableEntry("UITestTable", "ui_Test");
text.text = loadingResult.Entry.GetLocalizedString();
}
}
GetTableEntry()
第一個(gè)參數(shù)為多語言配置表的名字,第二個(gè)參數(shù)為該表里面的Key。
通過方法傳入多語言配置表的名字及對(duì)應(yīng)多語言的Key即可完成動(dòng)態(tài)文本賦值。
不過要注意的是字符串表可能不會(huì)立即可用,例如在本地化系統(tǒng)初始化期間或尚未加載表時(shí)。
為了保險(xiǎn)起見,可以確保該多語言配置表被加載出之后再進(jìn)行賦值,可以來看第二種方法的使用示例。
2.等待語言配置表初始化之后在賦值。
using System.Collections;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine;
using UnityEngine.Localization.Settings;
using UnityEngine.UI;
public class TestLocalization : MonoBehaviour
{
public Text text;
void Start()
{
StartCoroutine(LoadStrings());
}
IEnumerator LoadStrings()
{
// A string table may not be immediately available such as during initialization of the localization system or when a table has not been loaded yet.
var loadingOperation = LocalizationSettings.StringDatabase.GetTableAsync("UITestTable");
yield return loadingOperation;
if (loadingOperation.Status == AsyncOperationStatus.Succeeded)
{
var stringTable = loadingOperation.Result;
text.text = stringTable.GetEntry("ui_Test").GetLocalizedString();
}
else
{
Debug.LogError("Could not load String Table\n" + loadingOperation.OperationException.ToString());
}
}
}
3.初始化時(shí)獲得該多語言配置表,事件動(dòng)態(tài)更新文本。
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Tables;
using UnityEngine.UI;
public class Demo : MonoBehaviour
{
public Text Name;
private LocalizedStringTable stringTable = new LocalizedStringTable { TableReference = "UITestTable" };
void OnEnable()
{
stringTable.TableChanged += LoadStrings;
}
void OnDisable()
{
stringTable.TableChanged -= LoadStrings;
}
void LoadStrings(StringTable stringTable)
{
Name.text = GetLocalizedString(stringTable, "ui_Test");
}
static string GetLocalizedString(StringTable table, string entryName)
{
var entry = table.GetEntry(entryName);
return entry.GetLocalizedString();
}
}
以上幾種方法都可以正常使用,根據(jù)實(shí)際需求選擇合適的即可。
四、資源多語言映射表
除了上面說到的文本的本地化之外,Localization 還支持資源本地化,使用方法與配置文本的方法類似,下面來看一下。
打開菜單欄 Window -> Asset Management -> Localization Tables
,點(diǎn)擊New Table Collection創(chuàng)建表格。
該表格用于建立不同資源之間的對(duì)應(yīng)關(guān)系,一個(gè)key對(duì)應(yīng)多個(gè)語言的資源,這里選擇創(chuàng)建一個(gè)資源配置表(AssetsTable Collection),寫好表名后點(diǎn)擊Create就可以創(chuàng)建了,然后選擇一個(gè)路徑目錄進(jìn)行保存。
創(chuàng)建完之后與文本配置的處理方式一樣,在表中添加Key以及資源的內(nèi)容,測(cè)試示例如下:
然后在場(chǎng)景中添加一個(gè)Image組件,在右側(cè)菜單點(diǎn)擊Localize(或者自己添加組件),選擇我們添加的資源配置表中的Key即可完成。
效果如下,可以使用方法控制切換語言,也可以通過右上角進(jìn)行切換。
五、映射表 導(dǎo)入/導(dǎo)出 Excel 便于管理
當(dāng)項(xiàng)目中的文本量比較多的時(shí)候,使用Localization Table的方法會(huì)有些難以操作不便于管理。
所以此時(shí)可以考慮將Localization Table導(dǎo)出為Excel表格對(duì)文本進(jìn)行管理,Localization 是支持Table的導(dǎo)入和導(dǎo)出的,下面來看一下怎樣操作。
5.1 導(dǎo)出Localization Table為CSV
打開Localization Tables,然后右鍵Localization Table,選擇 Export -> CSV...
導(dǎo)出。
選擇一個(gè)文件目錄進(jìn)行保存,就可以看到導(dǎo)出的Excel表格內(nèi)容了,就是Localization Table中的內(nèi)容。
5.2 修改Excel中并重新導(dǎo)入
在導(dǎo)出的Excel表格中我們可以進(jìn)行增刪改查的操作對(duì)表格進(jìn)行管理,這樣比直接在Localization Table中管理要輕松的多。
修改完之后可以在導(dǎo)入Localization Table中,要注意的是修改完之后要改成UTF-8的編碼格式
再保存文件,不然導(dǎo)入之后中文會(huì)顯示亂碼。
如果不知道怎么直接保存為UTF-8的編碼格式,可以使用Notepad++等工具轉(zhuǎn)一下就可以了。
點(diǎn)擊Import -> CSV...
選擇對(duì)應(yīng)的文件進(jìn)行導(dǎo)入。
這樣就可以看到從Excel中修改后的內(nèi)容導(dǎo)入到Localization Table中啦。
亂碼問題:https://blog.csdn.net/shishuijun/article/details/129961436
六、Build
如果需要打包項(xiàng)目的話還需要對(duì)Localization Tables進(jìn)行Build一次,方法也很簡(jiǎn)單,下面看一下怎樣操作。
打開菜單欄 Window -> Asset Management -> Addressables -> Groups
。
然后在該窗口中選擇Build -> New Build -> Defaul Build Script
進(jìn)行Build,等待Build完成即可。
總結(jié)
-
Localization
工具的優(yōu)點(diǎn)在于該插件是Unity引擎原生解決方案,使用時(shí)只需要通過Package Manger導(dǎo)入即可。 - 導(dǎo)入及配置都比較簡(jiǎn)單,對(duì)于一些文本量不是很大的項(xiàng)目來說,該方案非常的合適。
- 當(dāng)項(xiàng)目對(duì)文本量需求非常大的時(shí)候,就需要配合Excel來管理了。
- 整理來說效果不錯(cuò),操作簡(jiǎn)單易上手,基本功能都有,是值得學(xué)習(xí)的一款多語言本地化解決方案。
?????? 最后給大家推薦一個(gè)功能齊全而且很好用的 IP代理網(wǎng)站:IPIDEA
使用這個(gè)代理IP,可以很輕松地訪問被封鎖的網(wǎng)站,避免被追蹤和監(jiān)控,保護(hù)自己的隱私和安全。而且這個(gè)代理IP還可以幫助我們加速網(wǎng)頁的加載速度,提高工作效率。
現(xiàn)在使用這個(gè)鏈接(https://share.ipidea.net/YYYYYY)注冊(cè)的新用戶還可以直接白嫖最少300M的流量,注冊(cè)認(rèn)證后最高可以送7.5G流量哦!
加上最近年終也有活動(dòng),優(yōu)惠力度還是蠻大的,有需要的小伙伴可以去搞一下試試,注冊(cè) == 白嫖
。
如果對(duì)此非常感興趣之前沒有用過或者不會(huì)使用的小伙伴也不用著急,在官網(wǎng)都有詳細(xì)的教程可以看,后面有時(shí)間的話也可以出一期教程幫助大家快速上手使用的哦!
?? 博客主頁:https://xiaoy.blog.csdn.net
?? 本文由 呆呆敲代碼的小Y 原創(chuàng) ??
?? 學(xué)習(xí)專欄推薦:Unity系統(tǒng)學(xué)習(xí)專欄
?? 游戲制作專欄推薦:游戲制作
??Unity實(shí)戰(zhàn)100例專欄推薦:Unity 實(shí)戰(zhàn)100例 教程
?? 歡迎點(diǎn)贊 ?? 收藏 ?留言 ?? 如有錯(cuò)誤敬請(qǐng)指正!
?? 未來很長(zhǎng),值得我們?nèi)Ρ几案篮玫纳?
------------------??分割線??-------------------------
文章來源:http://www.zghlxwxcb.cn/news/detail-751959.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-751959.html
到了這里,關(guān)于【Unity 實(shí)用工具篇】| 游戲多語言解決方案,官方插件Localization 實(shí)現(xiàn)本地化及多種語言切換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!