C# 使用自定义本地化资源生成

C# 使用自定义本地化资源生成,c#,scripting,unity3d,C#,Scripting,Unity3d,我一直在对unityAssetBundle和Resources类进行一些研究,但到目前为止,我还没有找到在构建时卸载资源的方法。这不是用于内存管理,而是用于构建/apk大小 例如,我有一个LocalizedAudio类:我有一个FR声音和一个US声音设置为这个类的一个实例。我需要找到一种方法告诉Unity,我只希望输出FR声音 问题在于,默认情况下,由单一行为(具有[SerializeField]属性的公共成员或私有成员)指向的每个资源都将被导出。是否有可能覆盖此行为?当您有5种或更多语言,但只

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

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

问题在于,默认情况下,由
单一行为
(具有
[SerializeField]
属性的
公共
成员或
私有
成员)指向的每个资源都将被导出。是否有可能覆盖此行为?当您有5种或更多语言,但只想为一种语言生成时,apk会变得非常大。对于一个中型游戏来说,在构建之前停用每一个资源是相当乏味的


目标是将不同的语言集加载到构建中,但我不确定我是否正确使用了
AssetsBundle
Resources

资源,只要它们位于“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编辑器时,所有字段都可用。构建项目时,可以在中编辑“脚本定义符号”,以启用
英语
法语
,或任何其他语言包

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

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

<> P的优点是,游戏在检查员中仍然很容易编辑。

侧注:考虑不要在标题中使用“卸载”。也许改为“使用一组本地化资源构建”之类的东西。顺便说一句,不需要在帖子中添加“谢谢”,检查原因——你的帖子已经显示出了很好的效果。@AlexeiLevenkov,谢谢你的提示,希望更清晰。现在我将阅读元数据。移动
资源
,然后玩
资产包
似乎比重写实际代码更实用。从长远来看,这样做可以用于上传应用程序更新的语言集,而无需重建。是吗?是的!AssetBundle很难使用(特别是因为它们不容易包含代码),但它们是动态内容的一个很好的选择。