【Unity】【I2 Localization】不可以将Source放在预制体里并将预制体放入场景中

I2 Localization插件官方有2种添加Source的方法,一种是在Resources文件夹下放I2Languages.asset文件,另一种是在场景中添加Source组件,使得翻译数据跟着场景加载和卸载。

这容易让人产生一个误会就是可以把Source放在预制里,再把预制放在场景中实现复用。而官方并没有推荐这个做法。这个做法不但不推荐,而且还有可能造成错误结果。

通过调试代码发现这样做插件会重复加载Source,也就是场景加载了一次,预制也加载了一次。重复的Source如果不进行任何修改的话不会有什么错误,但是一旦涉及修改问题就会变得很麻烦,因为你修改的Source和显示文字所使用的Source可能不是同一个。

举一个非常具体的例子:

创建一个预制,名为“SourceInProject”,添加Source并添加一个Term,名为“Term001”,文字为“Text001”。
在这里插入图片描述
把这个预制放在场景中,改名为“SourceInScene”
在这里插入图片描述
随便添加一个Text
在这里插入图片描述
添加Localize组件,选择刚刚添加的Term
在这里插入图片描述
此时翻译已经显示出来在这里插入图片描述
我们可以在LocalizationManager_Sources.cs的RegisterSceneSources()方法下打断点看到它是怎么加载Source的。这里的问题是它调用的是Resources.FindObjectsOfTypeAll()方法,该方法可以获取项目内的和场景内的所有组件。
在这里插入图片描述
可以看到它已经加载了3个Source,其中一个是I2Languages.asset上的Source,可以不用管它。另外两个就是上文所说的重复加载的Source,一个名为SourceInProject,一个名为SourceInScene。正常来讲应该只加载SourceInScene的,可是I2 Localization插件就是这么特别,可能为的是在非运行时也能编辑和使用预制里的数据。
在这里插入图片描述
在这里插入图片描述
可以写一段测试代码测试修改Term的情况

using I2.Loc;
using UnityEngine;

public class TestI2Localization : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            var source = LocalizationManager.Sources[1];
            var termData = source.GetTermData("Term001");
            termData.Languages[0] = "Text002";
        }

        if (Input.GetKeyDown(KeyCode.B))
        {
            var source = LocalizationManager.Sources[2];
            var termData = source.GetTermData("Term001");
            termData.Languages[0] = "Text003";
        }
    }
}

按了键盘上的A键之后,它修改了SourceInProject
在这里插入图片描述
SourceInProject的Term001的文字已经被修改成了Text002,修改成功了。
在这里插入图片描述
场景里的Text也同时被修改了
在这里插入图片描述
按了键盘上的B键之后,它修改了SourceInScene在这里插入图片描述
SourceInScene的Term001的文字已经被修改成了Text003在这里插入图片描述
但是场景里的Text并未被修改,还是Text002
在这里插入图片描述
不要以为它会先搜索预制的Source再搜索场景的Source,这个顺序是不确定的,再实验一两次就会发现Sources[1]对应的是SourceInScene,反过来了。

总结
I2 Localization插件加载Source的逻辑决定了它不支持把Source放在预制里,再把预制放在场景里的这种做法。这样做一是会造成数据的冗余,二是修改Term数据时如果使用LocalizationManager.Sources数组的话就要格外小心。正确的做法是,如果数据是跟着场景加载卸载的,就只在场景里添加Source;如果数据是一直使用的,就放在预制里就行了,它一样会加载的。
你问为什么不使用I2Lanugages.asset?因为它是固定在Resources文件夹里的,不能热更新。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是目前Unity最完整的本地化系统。 支持 Unity UI,Unity 2D,TextMesh Pro,NGUI,2D ToolKit,SVG导入器,标准组件 本地化 图像,文本,声音,字,精灵,地图集,预制件,TextMeshes,下拉列表等。 自动翻译 内置支持Google Translator,可自动将所有标签本地化为任何语言。 Google Spreadsheets和CSV文件 链接外部电子表格,即使在游戏发布后,也会自动下载任何更改。 检测并修复错误 解析场景以查找丢失或未使用的翻译以及重复或类似的术语。 子对象翻译 设置辅助术语不仅可以更改文本和图像,还可以更改每种语言使用的字和地图集。 回调和参数 可以修改翻译以使用语法语法插入分数,名称和游戏变量。 复数 每种语言的内置规则涵盖那些只需要单数/复数形式的规则,直到那些使用6种变的规则。 从右到左语言 正确呈现RTL语言,支持换行和对齐。 保存内存 仅使用您正在使用的字符创建字。链接您的AssetBundles以添加更多本地化内容。 简单高效 在一个位置编辑和预览所有翻译,然后在运行时仅加载当前语言。使用快速查找来访问它。 重复使用翻译 设置文本自动显示为大写,小写,上限,标题大小等。 在游戏动态翻译 Easy API在运行时翻译聊天消息和其他动态文本 应用程序名称和商店本地化 翻译游戏名称所有语言,并在Android / IOS商店显示您的游戏支持哪些语言 简单但功能强大的编辑器 直观的检查员允许您预览,编辑,分类,创建,解析和过滤甚至大型来源。 编译时间检查 将翻译转换为脚本常量,以避免在访问代码时使用Typos。 Playmaker 可以 快速,轻松,强大地访问本地元素和交换语言并与之交互的几种操作?没问题! 立即获取I2本地化,让您的游戏为世界做好准备!
Unity将文件夹预制放在指定位置,可以通过以下步骤实现。 首先,我们需要创建一个空的游戏对象,作为后续预制的父对象。在Unity的Hierarchy面板,选择Create - Empty Object来创建一个空的游戏对象。 接下来,我们需要将文件夹预制导入到Unity项目。在Unity的Project面板,找到需要导入的预制文件夹,将其拖拽到Unity的Project面板的一个目录下,导入到项目。 然后,我们需要在场景创建一个空的游戏对象,并将其作为实例化的预制的父对象。在Unity的Hierarchy面板,选择Create - Empty Object来创建一个空的游戏对象。 接着,我们需要编写代码来加载预制,并将其放置在指定位置。在Unity可以使用Instantiate函数来实例化预制。我们可以通过代码获取到需要放置预制的位置信息,并将实例化的预制设置为父对象的子对象。 最后,我们将实例化的预制设置为父对象的子对象后,就可以调整它在场景的位置。可以通过代码设置预制的Position、Rotation、Scale等属性,来调整其在场景的具位置。 总结起来,我们可以通过在Unity创建空的游戏对象、导入预制、实例化预制并设置其位置来将文件夹预制放置在指定位置。这样可以方便地管理和定位预制,提高项目开发的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值