【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 后记

暂时这些。

相关推荐
C蔡博士6 小时前
Unity2D物理系统-从入门到实战优化
unity·游戏引擎·rigidbody2d
mxwin12 小时前
Unity Shader 顶点动画:在顶点着色器中实现风吹草动、河流波动、布料模拟
unity·游戏引擎·shader·着色器
DowneyJoy13 小时前
【Unity3D补充知识点】常用数据结构分析-集合(List<T>)
数据结构·unity·c#·list
DowneyJoy14 小时前
【Unity3D补充知识点】常用数据结构分析-数组(Array)
数据结构·unity·c#
w-白兰地14 小时前
配置Unity中的ADB环境变量
unity·adb·游戏引擎
mxwin15 小时前
Unity Shader 几何着色器:动态生成图元与顶点拓扑修改
unity·游戏引擎·着色器
呆呆敲代码的小Y16 小时前
【Unity-AI开发篇】| 游戏中接入DeepSeek实现AI对话,完整详细步骤
人工智能·游戏·unity·ai·游戏引擎·u3d·deepseek
Sator12 天前
Unity关于射击游戏人物动画的设计经验
游戏·unity·游戏引擎
冰凌糕2 天前
Unity3D Shader 坐标空间详解
unity
心前阳光3 天前
Unity之ScrollRect简易实现
unity·游戏引擎