Version: 1.7
语言 : 中文
Instant Asset
Instant Asset 准备工作

Instant Asset 工作流程

要开始使用 Instant Asset,请按照以下步骤操作。

切换到支持平台

目前支持Windows、Android、iOS、WebGL和WeixinMiniGame平台。

  • Windows 支持x64架构下的Mono和IL2CPP后端。
  • Android 支持arm64架构下的IL2CPP后端。
  • iOS 支持x64和arm64架构下的IL2CPP后端。
  • WebGL 支持wasm架构下的IL2CPP后端。
  • WeixinMiniGame 支持wasm架构下的Mono和IL2CPP后端。

开启Instant Asset功能

ProjectSettings/Editor/Instant Player (Experimental)板块勾选Instant Assets按钮。

勾选Instant Assets按钮时,会同步勾选Asset Pipeline下的Enable Storage Artifact References In DBStorage NativeAsset In Library (Experimental)

Instant Asset相关选项
Instant Asset相关选项

其中:

  • Instant Assets 控制功能整体开关。
  • Preload Objects for AssetBundle 提前加载AssetBundle依赖资源。(仅在AssetBundle兼容InstantAsset时开启)
  • Preload Objects for Resources 提前加载Resources文件夹依赖资源。(勾选后支持同步加载Resources资源)
  • Use Customized URL 设置InstantAsset资源服务存放位置,默认为出包位置根目录。(仅WebGL平台有效)

构建Instant Asset

在 Assets 文件夹中创建一个名为 Editor 的文件夹,并将包含以下内容的脚本放在该文件夹中:

using UnityEditor;
using System.IO;

public class CreateInstantAsset
{
    [MenuItem("Assets/Build InstantAsset")]
    static void BuildAllInstantAssetTable()
    {
        string instantAssetDirectory = "Assets/InstantAsset";
        string[] assetPackDirectories = ["Assets/Textures", "Assets/Materials"];
        int size = 1024 * 1024;
        BuildTarget targetPlatform = BuildTarget.StandaloneWindows64;
        if(!Directory.Exists(instantAssetDirectory))
        {
            Directory.CreateDirectory(instantAssetDirectory);
        }
        InstantAssetEditorUtility.BuildAssetPacker(instantAssetDirectory, 
                                        assetPackDirectories,
                                        size, 
                                        targetPlatform);
    }
}

此脚本会在 Unity 编辑器的 Assets 菜单底部添加一个名为 “Build InstantAsset” 的菜单项。点击该菜单项后,会触发与该项关联的函数中的代码。执行时,脚本会收集 assetPackDirectories 目录下的所有资源,并将它们打包到由 assetPackDirectories 定义路径的文件夹内,每个资源包的大小由 size 指定,目标平台由 targetPlatform 指定。在 assetPackDirectories 中还会生成 InstantAssetTable文件(数量与 assetPackDirectories 大小一致)

加载 InstantAssetTable 和资源

InstantAssetTable 中包含了特定文件夹下资产及其依赖的信息。用户首先需要通过指定InstantAssetTable文件路径来加载 InstantAssetTable 对象,再利用 InstantAssetTable 加载资产。具体代码如下所示:

public class LoadInstantAsset : MonoBehaviour
{
    void Start() {
        var tablePath = "InstantAsset/InstantAssetTable_assets_prefabs";
        var myLoadedInstantAssetTable 
            = InstantAsset.ReadAssetTable(tablePath) as InstantAssetTable;
        if (myLoadedInstantAssetTable == null) {
            Debug.Log("Failed to load InstantAssetTable");
            return;
        }
        var prefab = myLoadedInstantAssetTable.LoadAsset<GameObject>("MyObject");
        Instantiate(prefab);
    }
}

另外,也可以通过异步的方式加载资源,具体代码如下所示:

public class LoadInstantAsset : MonoBehaviour
{
    IEnumerator Start() {
        var tablePath = "InstantAsset/InstantAssetTable_assets_prefabs";
        var myLoadedInstantAssetTable 
            = InstantAsset.ReadAssetTable(tablePath) as InstantAssetTable;

        InstantAssetRequest request = myLoadedInstantAssetTable.LoadAssetAsync<GameObject>("MyObject");

        while (!request.isDone)
        {
            Debug.Log("Loading progress: " + request.progress);
            yield return null;
        }

        if (request.asset != null)
        {
            var prefab = request.asset as GameObject;
            if (prefab != null)
            {
                Instantiate(prefab);
            }
        }
    }
}
Instant Asset
Instant Asset 准备工作