【Unity】本地化实现

个人向笔记。

1 前言

记录一下自己的本地化实现思路,暂时只讲本文的本地化实现。

2 文本本地化方案-个人

本地化实现是基于Luban的。自己使用Luban实现了一个"配置表模块",又实现了一个"全局配置模块",之后再基于这两个模块实现了"文本本地化模块"。

首先,我会制作一个本地化文本的Excel表,表中会记录个各种文本,每条数据是一个文本数据,包含Id、说明描述、文本内容(分多字段:简体中文、英文...)。可以看到,我是把所有语言都放到一个表中了,会一起读入内存中,也有将不同语言分开存放,根据需要再读入内存,这种暂时不讨论。

之后是模块初始化。系统首先会初始化"配置表模块",读取Excel配置表到内存,并提供对外访问接口。之后系统初始化"全局配置模块",从配置表中获取默认全局配置,并提供对外访问全局配置项的接口(这里实际就是属性)。然后初始化"文本本地化模块",会在主线程中设置语言环境(Cultture Info),并注册语言切换事件,用于在切换语言时,修改主线程的语言环境;同时提供方法,让外界提供文本ID,方法返回本地化文本,方法会根据全局配置中的当前语言提供对应文本。PS:语言环境会影响一些系统数值,比如通过DateTime获取的星期几,就会分中英文。

然后时项目中的应用。主要思想就是在相关脚本中,首先获取到各个Text对象,然后提供一个方法,用于根据Text Id通过"文本本地化模块"获取,在Awake中,调用此方法初始赋值,并注册语言切换事件,在切换语言时再次调用来赋值文本。但这个方法不太方便,因为涉及到Text的脚本较多,所以若以后有所代码修改,就需要在各个脚本中去修改,比较麻烦,所以这里提供第二种方法。创建一个脚本,此脚本会完成上面所讲的获取、注册事件、赋值文本的方法,并提供一个Public字段用于提供Text Id,然后将其挂在到具有Text组件的对象上即可,这样这个Text组件内容就可以实现本地化效果了,以后就算有代码修改也只需要在此脚本中修改即可,非常方便,而且本身也把文本本地化的实现进行了简化。

3 官方本地化插件

也可以参考官方本地化插件"Localization",直接在包管理器里搜索即可。

4 问题统计

4.1 语言长度问题

同样的话,不同语言的文本长度时不一致的,有些UI在切换语言后就会出现文本出框的问题,对于此问题我暂时想到的解决方案大致如下,分几步走:

  1. 分层简化。比如有些文本在一个名为药水的分类窗口内,那么内部药水的命名就可以进行简化,由"XXX药水"→"XXX"。
  2. 修改用词。有些语句直接翻译会很长,那么我们可以看看有没有相关简写的词可用,或是换个说法但不改变其意思。
  3. Text组件设置。我一般是会设置水平与垂直为Wrap、Truncate,然后设置Best Fit属性来让文本自适应调整大小。
  4. 单独处理。若前三步都没法解决,直接针对处理调整。

我一般对所有本地化文本做1、2、3的操作,若还有问题,则进行4操作。

5 后记

暂时这些。

相关推荐
Thomas_YXQ2 小时前
Unity3D IK解算器技术分析
开发语言·搜索引擎·unity·全文检索·unity3d·lucene
星火撩猿10 小时前
常见游戏引擎介绍与对比
unity·ue5·游戏引擎·godot
sky_smile_Allen11 小时前
[Unity]-[UI]-[Prefab] 关于Unity UGUI 的布局及组件讲解
ui·unity·游戏引擎
太妃糖耶16 小时前
URP-利用矩阵在Shader中实现物体的平移和缩放
unity·矩阵
是阿根1 天前
unity使用iTextSharp生成PDF文件
unity·c#·游戏引擎
常城2 天前
Unity中通过TMP使用图片字体
unity·游戏引擎
惊鸿醉2 天前
⭐Unity 开发 | 如何通过 NTP 网络时间实现精准的跨平台时间同步【附完整源码 + UI 模块 + 偏差分析】
网络·unity·游戏引擎
海鸥-w2 天前
Unity中使用Cinemachine插件创建自由视角相机(freelookCamera)来实现第三人称漫游
数码相机·unity·游戏引擎
EQ-雪梨蛋花汤2 天前
【Unity笔记】Unity音效管理:ScriptableObject配置 + 音量控制 + 编辑器预览播放自动化实现
笔记·unity·编辑器
qq_431331352 天前
Unity ML-Agents + VScode 环境搭建 Windows
windows·vscode·unity·强化学习