欢迎来到淼淼之森的个人小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

unity多语言实现

  |   0 评论   |   0 浏览

文本自适应

新建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脚本,在属性页面设置当前语言包下标,如下:
QQ截图20230506100154.png

语言替换

当需要使用其他语言时,只需要更换语言包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 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜爱上游戏开发