【问题标题】:Build with custom localized resources使用自定义本地化资源构建
【发布时间】:2014-03-28 16:04:38
【问题描述】:

我一直在对统一 AssetBundleResources 类进行一些研究,但到目前为止,我还没有找到在构建时卸载资源的方法。这不是用于内存管理,而是用于构建/apk 大小。

例如,我有一个 LocalizedAudio 类:我是否将 FR 声音和 US 声音设置为此类的一个实例。我需要找到一种方法告诉 Unity 我只想导出 FR 声音。

问题是MonoBehaviourpublic 成员或具有private 属性的private 成员)指向的每个资源将默认导出。是否可以覆盖此行为?当您拥有 5 种或更多语言但您只想为单一语言构建版本时,apk 会变得非常大。并且在构建之前停用每个资源对于中型游戏来说相当乏味。

目标是将不同的语言集加载到构建中,但我不确定我是否在使用 AssetsBundleResources 的正确轨道上。

【问题讨论】:

  • 旁注:考虑不要在标题中使用“卸载”。也许改为“使用一组本地化资源构建......”。顺便说一句,不需要在帖子中添加感谢 - 检查meta 的原因 - 你的帖子已经显示出很好的努力。
  • @AlexeiLevenkov,感谢您的提示,希望更清楚。我现在将阅读元数据。

标签: c# scripting unity3d


【解决方案1】:

资源总是包含在内,只要它们位于“资源”文件夹中。将它们从构建中删除的唯一方法是将它们移出该文件夹或重命名该文件夹。您可以对其进行设置,使每个语言包对资源文件使用类似的命名约定,并且在构建时只包含某些语言包。

资产包并不总是对设计人员友好,但它是实现资产动态包含的好方法。

您还有另一种选择:使用pre-processor directives 定义或取消定义某些变量。

假设您的字段是这样定义的:

[SerializeField] LanguagePack fr;
[SerializeField] LanguagePack en;

LanguagePack 的类型在这里并不重要。它只是您当前正在序列化的任何类型的替身。

您可以调整类,以便这些字段的声明是有条件的:

#if FRENCH || UNITY_EDITOR
[SerializeField] LanguagePack fr;
#endif

#if ENGLISH || UNITY_EDITOR
[SerializeField] LanguagePack en;
#endif

使用 Unity 编辑器时,所有字段均可用。在构建项目时,您可以在player settings 中编辑“脚本定义符号”以启用ENGLISHFRENCH 或任何其他语言包。

这可能需要引入一些复杂的代码,因为您定义的变量将取决于构建设置。在许多情况下,如果您添加一个用作别名的属性,它会导致代码更简单:

LanguagePack current {
    get {
        #if FRENCH
            return fr;
        #else
            return en;
        #endif
    }
}

所有这些的好处是游戏仍然很容易在检查器中编辑。

【讨论】:

  • 移动Resources 然后使用AssetsBundle 似乎比重写实际代码更实用。从长远来看,这样做可以用于上传 LanguageSets 以进行应用更新,而无需重建。对吗?
  • 是的! AssetBundle 很难使用(特别是因为它们不能轻易包含代码),但它们是动态内容的绝佳选择。
猜你喜欢
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多