Unity3d:在 Unity 4 中创建资源包

Unity3d:在 Unity 4 中创建资源包
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

在 Unity 4 中创建资源包

在 Unity 5 之前的 Unity 版本中,必须使用编辑器选择资源并将其添加到捆绑包中脚本
独自。(在Unity 5中,我们在编辑器中提供了将资源分配给特定捆绑包的工具)。此信息是为在 Unity 4 中处理旧项目的人员提供的,假设您使用的是 Unity 4。

要创建资源包,您需要使用 BuildPipeline 编辑器类。使用编辑器类的所有脚本都必须放置在名为“编辑器”的文件夹中,该文件夹位于“资产”文件夹中的任何位置。下面是 C# 中此类脚本的示例:

// Legacy Unity 4 example. Not for use in Unity 5 & onwards
using UnityEngine;
using UnityEditor;

public class ExportAssetBundles {
    [MenuItem("Assets/Build AssetBundle")]
    static void ExportResource () {
        string path = "Assets/myAssetBundle.unity3d";
        Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
        BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, 
                                       BuildAssetBundleOptions.CollectDependencies 
                                     | BuildAssetBundleOptions.CompleteAssets);
    }
}

编辑器脚本不需要应用于游戏对象
,则由编辑器使用。前面的示例将在编辑器的“资产”菜单中创建一个名为“构建资产包”的新项。

要使用此示例:

  • 在“项目视图”中名为“编辑器”的文件夹中创建名为 ExportAssetBundles.cs 的 C# 脚本文件。
  • 在项目文件夹中选择要制作成资产包的一个或多个资产。
  • 从“资产”菜单中选择“构建资产包”。单击“保存”以创建资产包。
  • 导出资源函数的第一行设置资产包的路径。
  • 下一行将要进入资产包的选择设置为在项目窗口
    .

BuildAssetBundle 函数是创建 AssetBundle 并将其保存到指定位置的行。第一个参数指定 mainAsset,这是一个特殊的资产,在从 AssetBundle 加载资产时,可以使用 mainAsset 属性直接获取。设置主资产不是强制性的,如果不打算使用它,则可以对参数使用 null。第二个参数是将构成资产包的对象数组。第三个参数是资产包将保存到磁盘上的位置。最终参数是构建资产包时使用的构建标志或选项。这些 BuildAssetBundleOptions 可以使用按位 OR 运算符进行组合。

构建资产包应该是一个预发布步骤,只需一次,并且只需一次函数调用,例如,使用构建所有资产包的菜单项。在开发应用程序时,应编写帮助程序脚本,这些脚本只需单击一下即可或在批处理模式下为目标平台构建所有资产包,而无需用户干预。

有三种类方法可用于构建资产包:

  • BuildPipeline.BuildAssetBundle 允许您构建任何类型的资产的 AssetBundle。
  • BuildPipeline.BuildStreamedSceneAssetBundle 用于只想包含场景
    在数据可用时进行流式传输和加载。
  • BuildPipeline.BuildAssetBundleExplicitAssetNames 与 BuildPipeline.BuildAssetBundle 相同,但有一个额外的参数来为每个对象指定自定义字符串标识符(名称)。

如何构建资产包的示例

构建资源包是通过编辑器脚本完成的。在 BuildPipeline.BuildAssetBundle 的脚本文档中有这方面的基本示例。

对于此示例,请将上述链接中的脚本复制并粘贴到名为 ExportAssetBundles 的新 C# 脚本中。此脚本应放置在名为编辑器的文件夹中,以便它在 Unity 编辑器中工作。

现在在资产
菜单,您应该会看到两个新的菜单选项。

  1. 从选择构建资产包 - 跟踪依赖项。这会将当前对象构建到资产包中,并包含其所有依赖项。例如,如果您有预 置
    它由几个分层层组成,然后它将递归地将所有子对象和组件添加到资源包中。
  2. 从选择构建资产包 - 无依赖关系跟踪。这与以前的方法相反,将仅包含您选择的单个资产。

对于此示例,应创建新的预制件。首先,通过转到“游戏对象”>“3D 对象>立方体”来创建新的多维数据集,这将在层次结构视图中创建一个新立方体。然后将多维数据集从“层次结构视图”拖到“项目视图”中,这将创建该对象的预制件。

然后,您应该在项目窗口中右键单击多维数据集预制件,然后选择从选择构建资产包 - 跟踪依赖项。 此时,您将看到一个窗口来保存“捆绑”资产。如果您创建了一个名为“AssetBundles”的新文件夹并将多维数据集另存为 Cube.unity3d,则项目窗口现在将如下所示。

此时,您可以将 AssetBundle Cube.unity3d 移动到本地存储上的其他位置,或将其上传到您选择的服务器。

构建资源包时如何更改资源属性的示例

您可以使用 AssetDatabase.ImportAsset 在调用 BuildPipeline.BuildAssetBundle 之前强制重新导入资产,然后使用 AssetPostprocessor.OnPreprocessTexture 设置所需的属性。以下示例将向您展示如何设置不同的纹理压缩
构建资源包时。

// Legacy Unity 4 example. Not for use in Unity 5 & onwards.
// Builds an asset bundle from the selected objects in the project view,
// and changes the texture format using an AssetPostprocessor.

using UnityEngine;
using UnityEditor;

public class ExportAssetBundles {
    
    // Store current texture format for the TextureProcessor.
    public static TextureImporterFormat textureFormat;
    
    [MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB2")]
    static void ExportResourceRGB2 () {
        textureFormat = TextureImporterFormat.PVRTC_RGB2;
        ExportResource();       
    }   
    
    [MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB4")]
    static void ExportResourceRGB4 () {
        textureFormat = TextureImporterFormat.PVRTC_RGB4;
        ExportResource();
    }
    
    static void ExportResource () {
        // Bring up save panel.
        string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
        
        if (path.Length != 0) {
            // Build the resource file from the active selection.
            Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
            
            foreach (object asset in selection) {
                string assetPath = AssetDatabase.GetAssetPath((UnityEngine.Object) asset);
                if (asset is Texture2D) {
                    // Force reimport thru TextureProcessor.
                    AssetDatabase.ImportAsset(assetPath);
                }
            }
            
            BuildPipeline.BuildAssetBundle(Selection.activeObject, 
                                           selection, 
                                           path, 
                                           BuildAssetBundleOptions.CollectDependencies |
                                           BuildAssetBundleOptions.CompleteAssets);
            Selection.objects = selection;
        }
    }
}
// Legacy Unity 4 example. Not for use in Unity 5 & onwards.
// Changes the texture format when building the Asset Bundle.

using UnityEngine;
using UnityEditor;

public class TextureProcessor : AssetPostprocessor
{ 
    void OnPreprocessTexture() {
        TextureImporter importer = assetImporter as TextureImporter;
        importer.textureFormat = ExportAssetBundles.textureFormat;
    }
}


您还可以使用 AssetDatabase.ImportAssetOptions 控制如何导入资产。

在测试环境中,有时需要测试需要重新构建资产包的更改。在这些情况下,建议在构建资产捆绑包时使用选项BuildAssetBundleOptions.UncompressedAssetBundle。这使得构建和加载资产包的速度更快,但它们也会更大,因此需要更长的时间来下载。

在生产环境中构建资产包

首次使用资产包时,手动构建它们似乎就足够了,如前面的示例所示。但是,随着项目规模的扩大和资产数量的增加,手动执行此过程效率不高。更好的方法是编写一个函数来构建项目的所有资产包。例如,您可以使用将资产文件映射到资产包文件的文本文件。

3D建模学习工作室整理翻译,转载请标明出处!

上一篇:Unity3d:缓存服务器 (mvrlink.com)

下一篇:Unity3d:在 Unity 4 中管理资源依赖关系 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号