【GameFramework框架内置模块】10、本地化(Localization)

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新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和坑,让后来人可以有些参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哔哩哔哩秋招Java二面

前言 作者&#xff1a;晓宜 个人简介&#xff1a;互联网大厂Java准入职&#xff0c;阿里云专家博主&#xff0c;csdn后端优质创作者&#xff0c;算法爱好者 一面过后面试官叫我别走&#xff0c;然后就直接二面&#xff0c;二面比较简短&#xff0c;记录一下&#xff0c;希望可以…

绝地求生:现在购买通行证还能兑换成长型武器吗?

大家好&#xff0c;我闲游盒&#xff0c;这几天收到几位盒友的私信咨询我现在购买通行证还能获得一把成长型武器吗&#xff1f;我相信还有许多盒友也有此困惑&#xff0c;那我就在这统一回复了&#xff0c;目前距通行证和商城物资箱礼包下架还有最后16天时间&#xff0c;众所周…

js实现hash路由原理

一、简单的上下布局&#xff0c;点击左侧导航&#xff0c;中间内容跟对变化&#xff0c;主要技术使用js检测路由的onhashchange事件 效果图 二、话不多说&#xff0c;直接上代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"…

FPGA控制AD7606_AD7606解读

目录 一、AD7606解读二、引脚说明三、时序图 一、AD7606解读 AD7606特点&#xff1a; 8通道同步采样模拟通道数为8分辨率&#xff1a;16bit&#xff0c;即最小采样的电压为5V/(2^16) 0,00007V&#xff0c;即数字量的1就代表模拟量的0,00007V&#xff0c;2代表0,00014V有效位数…

C语言易错知识点

1、数组长度及所占字节数 char x[] {"Hello"},y[]{H,e,l,l,o}; x数组的长度为5&#xff0c;y的长度也是5 x、y数组所占字符串为6为 51(\0)6 strlen&#xff08;&#xff09;函数得到的是数组的长度 2、%%与%的优先级 #include<stdio.h> int main(){ int a…

iOS图片占内存大小与什么有关?

1. 问&#xff1a;一张图片所占内存大小跟什么有关&#xff1f; 图片所占内存大小&#xff0c;与图片的宽高有关 我们平时看到的png、jpg、webp这些图片格式&#xff0c;其实都是图片压缩格式。通过对应的算法来优化了大小以节省网络传输与本地保存所需的资源。 但是当我们加…

再谈EMC Unity存储系统内存DIMM问题

以前写过一篇关于EMC Unity 存储系统的DIMM的介绍文章&#xff0c;但是最近还是遇到很多关于内存的问题&#xff0c;还有一些退货&#xff0c;所以有必要再写一篇关于EMC Unity 内存方面的问题&#xff0c;供朋友们参考。如果还有疑问&#xff0c;可以加vx&#xff1a;StorageE…

【黑马头条】-day01环境搭建SpringBoot-Cloud-Nacos

文章目录 1 环境搭建及简介2 项目介绍2.1 应用2.2 业务说明2.3 技术栈2.4 收获2.5 大纲 3 Nacos准备3.1 安装Nacos 4 初始工程搭建4.1 环境准备4.1.1 导入项目4.1.2 设置本地仓库4.1.3 设置项目编码格式 4.2 全局异常4.2.1 自动装配 4.3 工程主体结构 5 登录功能开发5.1 需求分…

echart多折线图堆叠 y轴和实际数据不对应

当使用 ECharts 绘制堆叠折线图时&#xff0c;有时会遇到 y 轴与实际数据不对应的问题。 比如明明值是50&#xff0c;但折线点在y轴的对应点却飙升到了二百多 解决办法&#xff1a; 查看了前端代码发现在echart的图表中有一个‘stack’的属性&#xff0c;尝试把他删除之后y轴的…

算法体系-11 第十一节:二叉树基本算法(上)

一 两链表相交 1.1 题目描述 给定两个可能有环也可能无环的单链表&#xff0c;头节点head1和head2。请实现一个函数&#xff0c;如果两个链表相交&#xff0c;请返回相交的 第一个节点。如果不相交&#xff0c;返回null 【要求】 如果两个链表长度之和为N&#xff0c;时间复杂…

静电无处不在:揭秘液晶显示屏静电防护的“大师级“策略

静电&#xff0c;仿佛是电子产品制造过程中的隐形杀手&#xff0c;尤其对于液晶显示屏等精密电子元器件的影响更是不可小觑。然而&#xff0c;面对这一挑战&#xff0c;有些制造商采取了一系列超越寻常的静电防护措施。今天&#xff0c;我们将揭开他们的"大师级"策略…

利用Android studio 查看模拟器中数据文件

打开Android studio &#xff0c;然后按照下图选择 然后会在右侧打开一个这样子的管理弹窗 找到 data/data/your project file 你的缓存跟下载的文件就都在里面了

BigDecimal保留两位小数失败问题

文章目录 背景问题解决如何测试代码 背景 测试时发现在线swagger测试会自动处理BigDecimal小数点后面的数字&#xff0c;就是有零的会都给你去掉&#xff0c;比如9.000与9.500到最后都会被swagger处理成9跟9.5。使用postman测是最准的&#xff0c;测出来的就是9.000跟9.500。 …

数据库基本内容与安装MySQL数据库

目录 一.数据库基本内容 1.数据 &#xff08;1&#xff09;描述事物的符号记录 &#xff08;2&#xff09;包括数字&#xff0c;文字、图形、图像、声音、档案记录等 &#xff08;3&#xff09;以“记录”形式按统一的格式进行存储 2.表 &#xff08;1&#xff09;将不同…

【Linux】基础 IO(动静态库)-- 详解

一、前言 为什么要使用别人的代码&#xff1f; 主要是为了提高程序开发的效率和程序的健壮性。 当别人把功能都实现了&#xff0c;然后我们再基于别人的代码去做二次开发&#xff0c;那么效率当然就提高了。其次&#xff0c;这里基于的别人当然不是随便找的一个人&#xff0c;…

[Qt学习笔记]Qt鼠标事件mouseMoveEvent实时获取图像的坐标和像素值

目录 1、介绍2、效果展示3、实现过程3.1 图像的加载和显示3.2 设置鼠标跟踪事件激活3.3 实现代码 4、源码展示 1、介绍 上一篇介绍了使用OpenCV的setMouseCallback回调函数实现获取鼠标点击点的图像坐标和像素值&#xff0c;本篇使用鼠标事件mouseMoveEvent函数来实现实时获取…

OPPO 后端二面,凉凉。。。

美众议院通过 TikTok 法案 之前我们讲了 老美要求字节跳动在 165 天内剥离短视频应用 TikTok&#xff0c;当时的最新进度是 TikTok 给 1.7 亿美国用户发弹窗&#xff0c;发动用户群众给国会打电话进行抗议。 但显然这点力度的抗议并不会造成什么实质影响。 昨晚&#xff0c;美国…

精读《useRef 与 createRef 的区别》

1 引言 useRef 是常用的 API&#xff0c;但还有一个 createRef 的 API&#xff0c;你知道他们的区别吗&#xff1f;通过 React.useRef and React.createRef: The Difference 这篇文章&#xff0c;你可以了解到何时该使用它们。 2 概述 其实原文就阐述了这样一个事实&#xf…

【EDSR】《Enhanced Deep Residual Networks for Single Image Super-Resolution》

CVPR workshops-2017 首尔大学 code&#xff1a; https://github.com/limbee/NTIRE2017/tree/masterhttps://github.com/sanghyun-son/EDSR-PyTorch 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Residual blocks4.2 Single…

盘点国内IP地址服务的功能及提供商

随着互联网的快速发展和普及&#xff0c;IP地址服务提供商在中国市场扮演着越来越重要的角色。这些代理软件提供商不仅为用户提供稳定的网络连接&#xff0c;还可以帮助用户实现IP地址切换、绕过地理限制等功能。虎观代理接下来将详解国内IP地址服务的主要功能&#xff0c;并对…