unity多语言实现
文本自适应
新建Lanuage.cs脚本,代码如下:
using LuaInterface;
using MillionSys;
using UnityEngine;
using UnityEngine.UI;
[SerializeField]
[RequireComponent(typeof(Text))]
public class Lanuage : MonoBehaviour
{
public enum StartAxisType
{
Horizontal,
Vertical
}
public int index;
public bool mAdaptiveSize = false;//动态变换的选项
public StartAxisType mStartAxis = StartAxisType.Horizontal;//动态变换的方式
Text text;
Vector2 mRectSize;//文本款的sizeDelta
RectTransform mRect;
float mRectSize_BeginX;
float mRectSize_BeginY;
void Awake()
{
text = transform.GetComponent<Text>();
if (index > 0)
{
LuaFunction fun = LuaClient.GetMainState().GetFunction("LanguageManager.GetString");
if (fun != null)
{
string a = fun.Invoke<int, string>(index);
if (a == null)
{
Debug.LogError("缺少语言包======================" + index);
}
else
{
text.text = a;
}
}
}
}
public void SetText(string text)
{
if(this.text == null)
{
this.mRect = transform.GetComponent<RectTransform>();
mRectSize = mRect.sizeDelta;
this.text = transform.GetComponent<Text>();
mRectSize_BeginX = mRectSize.x;
mRectSize_BeginY = mRectSize.y;
}
this.text.text = text;
TextAdapt();
}
public void TextAdapt()
{
if (!mAdaptiveSize || text == null)
{
return;
}
switch (mStartAxis)
{
case StartAxisType.Horizontal:
if (text.preferredWidth > mRectSize.x)
{
//高度不变,宽度随字数长度变化
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, mRectSize.y);
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, text.preferredWidth);
}
else if (text.preferredWidth == 0)
{
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, mRectSize_BeginX);
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, mRectSize_BeginY);
}
else
{
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, mRectSize.y);
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, text.preferredWidth);
}
break;
case StartAxisType.Vertical:
if (text.preferredHeight > mRectSize.y)
{
//宽度不变,高度随字数长度变化
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, mRectSize.x);
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, text.preferredHeight);
}
else if (text.preferredWidth == 0)
{
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, mRectSize_BeginX);
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, mRectSize_BeginY);
}
else
{
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, mRectSize.x);
mRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, text.preferredHeight);
}
break;
default:
break;
}
}
}
创建语言包Language.lua
例如:
Language = {
[1] = "开始游戏",
[2] = "结束游戏",
}
挂载脚本
Text组件添加Lanuage.cs脚本,在属性页面设置当前语言包下标,如下:
语言替换
当需要使用其他语言时,只需要更换语言包Language.lua里面的语言为对应的语言。
拓展
当文本需要动态读取时,可以创建langManager.lua文件,用于管理文本加载方式。读取语言包还是配置
,代码如下:
langManager = {}
local wenbenConfig = dataManager.getdatabase("word1_proto")
local wb = "data1" -- 默认data1中文
-- 程序内部的文本
function langManager.getstring(index)
if Language[index] ~= nil then
return Language[index]
else
logerror("程序文本不存在id:"..index)
return ""
end
end
-- 读文本表
function langManager.getConfigString(index)
if wenbenConfig == nil then
wenbenConfig = dataManager.getdatabase("word1_proto")
end
if wenbenConfig[index] then
return wenbenConfig[index][wb] or wenbenConfig[index].data1 or "null" --默认返回data1
else
logerror("文本表不存在id:"..index)
end
return index
end
-- 初始化配置表文本 配置表需要多语言显示的文字 一般包括name,description
function langManager.Init()
local wenben_list = {
item_proto = {"word1", "word2"},
}
for proto,key in pairs(wenben_list) do
for j,v in pairs(dataManager.getdatabase(proto)) do
for _, name in ipairs(key) do
if v[name] and v[name] ~= 0 then
v[name] = langManager.getConfigString(v[name])
end
end
end
end
end
标题:unity多语言实现
作者:shirlnGame
地址:https://www.mmzsblog.cn/articles/2023/05/06/1683340957787.html
如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议!
本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!