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

本文关键字:构建 资源 本地化 自定义 | 更新日期: 2023-09-27 17:54:27

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

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

问题是由MonoBehaviour (public成员或具有[SerializeField]属性的private成员)指向的每个资源将默认导出。是否有可能重写此行为?当你有5种或更多的语言,但你只想为一种语言做一个构建时,apk会变得非常大。对于中等规模的游戏来说,在构建之前停用每种资源是相当乏味的。

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

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

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

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

你还有一个选择:使用预处理器指令来定义或取消定义某些变量。

为了便于讨论,假设您的字段定义如下:

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

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

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

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

当使用Unity编辑器时,所有字段都是可用的。当构建一个项目时,你可以在播放器设置中编辑"脚本定义符号"以启用ENGLISH, FRENCH或任何其他语言包。

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

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

这样做的好处是,在检查器中编辑游戏仍然很容易。