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做一些簡單的數據上傳和下載讀取。剛好上個公司沒撐過疫情,所以希望下個工作能找個做聯網遊戲的公司學習學習。把這個部分也完成。
以上。

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