使用自定义本地化资源构建

时间:2014-03-28 16:04:38

标签: c# scripting unity3d

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

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

问题是默认情况下会导出MonoBehaviourpublic成员或具有private属性的[SerializeField]成员)指向的每个资源。有可能覆盖这种行为吗?当你有5种或更多语言时,apk变得非常大,但你只想为单一语言构建一个。并且在构建之前停用每个资源对于中等大小的游戏来说是相当繁琐的。

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

1 个答案:

答案 0 :(得分:0)

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

资产包并不总是设计师友好,但却是实现动态包含资产的好方法。

您还有另一个选择:使用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编辑器时,所有字段都可用。在构建项目时,您可以编辑" Scripting Define Symbols"在player settings中启用ENGLISHFRENCH或其他任何语言包。

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

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

所有这一切的优点是游戏仍然可以在检查员中轻松编辑。