0
点赞
收藏
分享

微信扫一扫

读书·计算机组成与设计:软硬件接口RISC-V版·第三章

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

【GameFramework框架】系列教程目录:
https://blog.csdn.net/q764424567/article/details/135831551

二、正文

2-1、介绍

本地化(Localization),也就是我们所说的不同地区的语言适配,比如说中文版“你好”,英文版是“Hello”。

GameFramework在本地化方面,不仅支持文本的本地化,还支持任意资源的本地化,比如说游戏中释放烟花的特效也可以做出不同地区的版本,使得中文版烟花里面的“新年好”字样的特效,在英文版里面是“Happy New Year”字样的特效。

2-2、使用说明

2-2-1、准备语言版本

官方示例项目StarForce里面默认提供了四种语言的版本,路径在Assets/GameMain/Localization里面:
在这里插入图片描述
首先,需要将对应的语言写成XML文件,格式为一个Key对应一个Value,这个格式不能更改,因为涉及到后面的语言表的解析。

2-2-2、语言设置

启动流程ProcedureLaunch.csOnEnter方法中进行了语言的设置:

using GameFramework.Localization;
using System;
using UnityGameFramework.Runtime;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;

namespace StarForce
{
    public class ProcedureLaunch : ProcedureBase
    {
        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);
            // 语言配置:设置当前使用的语言,如果不设置,则默认使用操作系统语言
            InitLanguageSettings();
        }

        private void InitLanguageSettings()
        {
            if (GameEntry.Base.EditorResourceMode && GameEntry.Base.EditorLanguage != Language.Unspecified)
            {
                // 编辑器资源模式直接使用 Inspector 上设置的语言
                return;
            }

            Language language = GameEntry.Localization.Language;
            if (GameEntry.Setting.HasSetting(Constant.Setting.Language))
            {
                try
                {
                    string languageString = GameEntry.Setting.GetString(Constant.Setting.Language);
                    language = (Language)Enum.Parse(typeof(Language), languageString);
                }
                catch
                {
                }
            }

            if (language != Language.English
                && language != Language.ChineseSimplified
                && language != Language.ChineseTraditional
                && language != Language.Korean)
            {
                // 若是暂不支持的语言,则使用英语
                language = Language.English;

                GameEntry.Setting.SetString(Constant.Setting.Language, language.ToString());
                GameEntry.Setting.Save();
            }

            GameEntry.Localization.Language = language;
            Log.Info("Init language settings complete, current language is '{0}'.", language.ToString());
        }
    }
}

这里用到了配置组件(SettingComponent),获取数据,首次进入游戏,这个值没有设置,会默认使用系统语言。

编辑器模式下,直接使用编辑器配置的语言。

2-2-3、语言表加载加入本地化组件

启动流程ProcedureLaunch.csLoadDictionary方法中进行了语言表加载:

private void LoadDictionary(string dictionaryName)
{
    string dictionaryAssetName = AssetUtility.GetDictionaryAsset(dictionaryName, false);
    m_LoadedFlag.Add(dictionaryAssetName, false);
    GameEntry.Localization.ReadData(dictionaryAssetName, this);
}

通过语言名称获取加载路径:

public static string GetDictionaryAsset(string assetName, bool fromBytes)
{
    return Utility.Text.Format("Assets/GameMain/Localization/{0}/Dictionaries/{1}.{2}", GameEntry.Localization.Language, assetName, fromBytes ? "bytes" : "xml");
}

并读取其中的key-value的键值对,保存到本地化(Localization)组件中。

2-2-4、语言加载

语言加载完成后,如下图在UI父类UGuiForm.cs里,获取了UI所有的text组件。并将text当前值作为key去获取对应value,并将value写入text:

protected override void OnInit(object userData)
{
    base.OnInit(userData);

    m_CachedCanvas = gameObject.GetOrAddComponent<Canvas>();
    m_CachedCanvas.overrideSorting = true;
    OriginalDepth = m_CachedCanvas.sortingOrder;

    m_CanvasGroup = gameObject.GetOrAddComponent<CanvasGroup>();

    RectTransform transform = GetComponent<RectTransform>();
    transform.anchorMin = Vector2.zero;
    transform.anchorMax = Vector2.one;
    transform.anchoredPosition = Vector2.zero;
    transform.sizeDelta = Vector2.zero;

    gameObject.GetOrAddComponent<GraphicRaycaster>();

    Text[] texts = GetComponentsInChildren<Text>(true);
    for (int i = 0; i < texts.Length; i++)
    {
        texts[i].font = s_MainFont;
        if (!string.IsNullOrEmpty(texts[i].text))
        {
            texts[i].text = GameEntry.Localization.GetString(texts[i].text);
        }
    }
}

文本需要动态赋值也可以使用同样的方式,比如判断版本的流程ProcedureCheckVersion.cs的更新游戏应用的时候使用:

if (m_VersionInfo.ForceUpdateGame)
{
    // 需要强制更新游戏应用
    GameEntry.UI.OpenDialog(new DialogParams
    {
        Mode = 2,
        Title = GameEntry.Localization.GetString("ForceUpdate.Title"),
        Message = GameEntry.Localization.GetString("ForceUpdate.Message"),
        ConfirmText = GameEntry.Localization.GetString("ForceUpdate.UpdateButton"),
        OnClickConfirm = GotoUpdateApp,
        CancelText = GameEntry.Localization.GetString("ForceUpdate.QuitButton"),
        OnClickCancel = delegate (object userData) { UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Quit); },
    });

    return;
}
2-2-5、游戏中切换语言

在游戏内部更改并保存语言的话,会调用SettingForm.cs里面的OnSubmitButtonClick函数,在设置完成后,停止播放音乐,并重启游戏框架:

public void OnSubmitButtonClick()
{
    if (m_SelectedLanguage == GameEntry.Localization.Language)
    {
        Close();
        return;
    }

    GameEntry.Setting.SetString(Constant.Setting.Language, m_SelectedLanguage.ToString());
    GameEntry.Setting.Save();

    GameEntry.Sound.StopMusic();
    UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Restart);
}

2-3、实现及代码分析

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
举报

相关推荐

0 条评论