要开始使用 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后端。在ProjectSettings
/Editor
/Instant Player (Experimental)
板块勾选Instant Assets
按钮。
勾选Instant Assets
按钮时,会同步勾选Asset Pipeline
下的Enable Storage Artifact References In DB
和Storage NativeAsset In Library (Experimental)
。
其中:
Instant Assets
控制功能整体开关。Preload Objects for AssetBundle
提前加载AssetBundle
依赖资源。(仅在AssetBundle
兼容InstantAsset
时开启)Preload Objects for Resources
提前加载Resources
文件夹依赖资源。(勾选后支持同步加载Resources
资源)Use Customized URL
设置InstantAsset资源服务存放位置,默认为出包位置根目录。(仅WebGL平台有效)在 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 加载资产。具体代码如下所示:
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);
}
}
}
}