Unity实现多语言的转换。

这个应该属于撸一个适合自己的小游戏框架的第六篇。上一篇是Unity读写Excel表格及 C#反射的简单理解。
实现多语言转化其实也是很常用的功能。尤其是做海外版本的,可能还要涉及多国语言。
这里就介绍一个简单的实现方案。通过配置表格来实现多语言切换。
直接上脚本吧。
脚本1:脚本出现时替换成对应ID的脚本。

public class LabelLocal : MonoBehaviour {

    //挂载在需要转换的文字组件上,填写对应ID。
    public int languageId;

    void OnEnable()
    {
        Text t = GetComponent<Text>();

        if (t != null)
        {
            t.text = LanguageMgr.GetById(languageId);
        }
    }

}

脚本2:多语言控制脚本。

public class LanguageMgr : MonoBehaviour {

//演示原因,只做了两种语言。具体需求的话可以在枚举中继续添加。
    public enum LanguageType
    {
        cn,
        en,
    }
    public static LanguageType type = LanguageType.cn;
    //初始化语言。这个需要注意,一定要先于脚本1执行或者先于脚本1方法的生命周期前执行。
	public static void Init () {

        if(Application.systemLanguage == SystemLanguage.Chinese)
        {
            type = LanguageType.cn;
        }
        else
        {
            type = LanguageType.en;
        }
        //如果存的有,设置为默认的
        string defaul = PlayerPrefs.GetString("Language");
        //检索指定枚举中常数名称的数组。
        string[] language = System.Enum.GetNames(typeof(LanguageType));
        for (int i = 0; i < language.Length; i++)
        {
            if (defaul.Equals(language[i]))
            {
                //把将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。
                type = (LanguageType)System.Enum.Parse(typeof(LanguageType), defaul);
                break;
            }
        }
    }

    //实时设置语言,切换时会变更当前所以场景内存在的多语言
    public static void ChangeLanguage(LanguageType _type)
    {
        type = _type;

        UpdateLanguage();

        PlayerPrefs.SetString("Language", (_type.ToString()));
    }
    static void UpdateLanguage()
    {
        LabelLocal[] locals = FindObjectsOfType<LabelLocal>();

        for(int i=0;i<locals.Length;i++)
        {
            Text t = locals[i].GetComponent<Text>();
            if(t != null)
            {
                t.text = GetById(locals[i].languageId);
            }
        }
    }

    //用Id取一个语言。这块就是通过读取数据取值。这个数据可以是你定义的各种数值类型,只要你能读到就行,是个暴露给脚本1的使用方法。
    public static string GetById(int id)
    {
        if (type == LanguageType.cn)
        {
            return MyGameData.config.TestLanguage[id].cn;
        }
        else if (type == LanguageType.en)
        {
            return MyGameData.config.TestLanguage[id].en;
        }
        return  MyGameData.config.TestLanguage[id].en;
    }

}

疑问比较多的地方在于脚本2的最后一个方法,获取数据。
因为我这里并没有定义数据这块。原参考脚本是有定义json数据和解析方法的。但我需要配合我前一篇做的excel数据结构来实现这个功能。所以改成了读取框架内数据结构的方法。
可以参考我上一篇文章来自动生成一个多语言的数据表格。
多语言到此完结。

以下是关于小框架的总结

另外关于小游戏框架的功能也到此为一个节点。主要功能如下在这里插入图片描述
这也是我之前在做休闲游戏常用的一些功能。
其实本来还想增加一些之前用的动画效果和一些数据同步的东西。
但都需要用额外的一些插件。比如说dotween和Unirx。但可能都会让学习成本变高,而且额外的插件可能不是所有人都需要的。
做这个之前有在使用QFramework。但是因为它的的功能太多,很多功能也在更加完善的同时也更复杂。在做休闲游戏上有些大材小用,学习成本相对也高一些。所以就总结了这个可以直接上手的功能合集。
因为在写这个的时候参考了比较多的游戏框架。所以在做的时候留了很多可以扩展的地方。
后续的话可能考虑加入热更新和联网的相关部分。因为热更新可能导致苹果封号,所以之前了解一些但没有实际应用过。而且写习惯C#的话写lua的时候经常搞混语法,所以热更的话可能会使用CSHotFix,是一个C#语言的热更新技术。
联网的话是基本没接触过,只从一些游戏框架里大概了解到是服务器存取数据的一些操作。自己的话只用过www和java的http做一些简单的数据上传和下载读取。刚好上个公司没撑过疫情,所以希望下个工作能找个做联网游戏的公司学习学习。把这个部分也完成。
以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章