15.其他_资源加载相关_根据资源定位信息加载资源
15.1 知识点
回顾学过的加载可寻址资源的方式
- 通过标识类进行加载(指定资源加载)
AssetReference.LoadAssetAsync<GameObject>();
- 通过资源名或标签名加载单个资源(动态加载)
Addressables.LoadAssetAsync<GameObject>("Cube")
- 通过资源名或标签名或两者组合加载多个资源(动态加载)
Addressables.LoadAssetsAsync<GameObject>(new List<string>() { "Cube", "SD" }, (obj) => { }, Addressables.MergeMode.Intersection);
加载资源时Addressables帮助我们做了哪些事情?
主要做的事
- 查找指定键的资源位置
- 收集依赖项列表
- 下载所需的所有远程AB包
- 将AB包加载到内存中
- 设置Result资源对象的值
- 更新Status状态变量参数并且调用完成事件Completed
如果加载成功Status状态为成功,并且可以从Result中得到内容
如果加载失败除了Status状态为失败外,如果我们启用了AddressableAssetSettings配置的LogRuntimeExceptions选项吗,会在Console窗口打印信息
根据名字或者标签获取 资源定位信息 加载资源
Addressables.LoadResourceLocationsAsync 异步加载单Key资源定位信息
Addressables.LoadAssetAsync 传入ResourceLocation资源定位信息进行一步加载
// Addressables.LoadResourceLocationsAsync 异步加载资源定位信息 返回列表型handle
//参数一:资源名或者标签名
//参数二:资源类型
AsyncOperationHandle<IList<IResourceLocation>> asyncOperationHandle = Addressables.LoadResourceLocationsAsync("Cube", typeof(GameObject));
asyncOperationHandle.Completed += (handle) =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
//handle.Result是所有满足条件的资源的资源定位信息列表
foreach (var resourceLocation in handle.Result)
{
//我们可以利用定位信息 再去加载资源
print(resourceLocation.PrimaryKey);//打印出资源名
//根据资源定位信息异步加载资源
Addressables.LoadAssetAsync<GameObject>(resourceLocation).Completed += (obj) => { Instantiate(obj.Result); };
}
}
else
{
Addressables.Release(asyncOperationHandle);
}
};
根据名字标签组合信息获取 资源定位信息 加载资源
Addressables.LoadResourceLocationsAsync 异步加载多Key资源定位信息
// Addressables.LoadResourceLocationsAsync 异步加载组合型资源定位信息 返回列表型handle
//参数一:资源名和标签名的组合
//参数二:合并模式
//参数三:资源类型
AsyncOperationHandle<IList<IResourceLocation>> asyncOperationHandle2 = Addressables.LoadResourceLocationsAsync(new List<string>() { "Cube", "Sphere", "SD" }, Addressables.MergeMode.Union, typeof(Object));
asyncOperationHandle2.Completed += (handle) =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
//资源定位信息加载成功
foreach (var resourceLocation in handle.Result)
{
//使用定位信息来加载资源
//我们可以利用定位信息 再去加载资源
print("******");
print(resourceLocation.PrimaryKey);//资源名
print(resourceLocation.InternalId);//资源路径
print(resourceLocation.ResourceType.Name);//资源类型
Addressables.LoadAssetAsync<Object>(resourceLocation).Completed += (obj) =>
{
//Instantiate(obj.Result);
};
}
}
else
{
Addressables.Release(asyncOperationHandle2);
}
};
根据资源定位信息加载资源的注意事项
- 资源信息当中提供了一些额外信息
- PrimaryKey:资源主键(资源名)
- InternalId:资源内部ID(资源路径)
- ResourceType:资源类型(Type可以获取资源类型名)
我们可以利用这些信息处理一些特殊需求
比如加载多个不同类型资源时 可以通过他们进行判断再分别进行处理
- 根据资源定位信息加载资源并不会加大我们加载开销
只是分部完成加载了而已
15.2 知识点代码
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceLocations;
using UnityEngine.Serialization;
public class Lesson15_其他_资源加载相关_根据资源定位信息加载资源 : MonoBehaviour
{
public AssetReference assetReference;
void Start()
{
#region 知识点一 回顾学过的加载可寻址资源的方式
//1.通过标识类进行加载(指定资源加载) AssetReference
//2.通过资源名或标签名加载单个资源(动态加载)
//Addressables.LoadAssetAsync<GameObject>("Cube")
//3.通过资源名或标签名或两者组合加载多个资源(动态加载)
//Addressables.LoadAssetsAsync<GameObject>(new List<string>() { "Cube", "SD" }, (obj) => { }, Addressables.MergeMode.Intersection);
#endregion
#region 知识点二 加载资源时Addressables帮助我们做了哪些事情?
//1.查找指定键的资源位置
//2.收集依赖项列表
//3.下载所需的所有远程AB包
//4.将AB包加载到内存中
//5.设置Result资源对象的值
//6.更新Status状态变量参数并且调用完成事件Completed
//如果加载成功Status状态为成功,并且可以从Result中得到内容
//如果加载失败除了Status状态为失败外
//如果我们启用了 Log Runtime Exceptions选项 会在Console窗口打印信息
#endregion
#region 知识点三 根据名字或者标签获取 资源定位信息 加载资源
// Addressables.LoadResourceLocationsAsync 异步加载资源定位信息 返回列表型handle
//参数一:资源名或者标签名
//参数二:资源类型
AsyncOperationHandle<IList<IResourceLocation>> asyncOperationHandle = Addressables.LoadResourceLocationsAsync("Cube", typeof(GameObject));
asyncOperationHandle.Completed += (handle) =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
//handle.Result是所有满足条件的资源的资源定位信息列表
foreach (var resourceLocation in handle.Result)
{
//我们可以利用定位信息 再去加载资源
print(resourceLocation.PrimaryKey);//打印出资源名
//根据资源定位信息异步加载资源
Addressables.LoadAssetAsync<GameObject>(resourceLocation).Completed += (obj) => { Instantiate(obj.Result); };
}
}
else
{
Addressables.Release(asyncOperationHandle);
}
};
#endregion
#region 知识点四 根据名字标签组合信息获取 资源定位信息 加载资源
// Addressables.LoadResourceLocationsAsync 异步加载组合型资源定位信息 返回列表型handle
//参数一:资源名和标签名的组合
//参数二:合并模式
//参数三:资源类型
AsyncOperationHandle<IList<IResourceLocation>> asyncOperationHandle2 = Addressables.LoadResourceLocationsAsync(new List<string>() { "Cube", "Sphere", "SD" }, Addressables.MergeMode.Union, typeof(Object));
asyncOperationHandle2.Completed += (handle) =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
//资源定位信息加载成功
foreach (var resourceLocation in handle.Result)
{
//使用定位信息来加载资源
//我们可以利用定位信息 再去加载资源
print("******");
print(resourceLocation.PrimaryKey);//资源名
print(resourceLocation.InternalId);//资源路径
print(resourceLocation.ResourceType.Name);//资源类型
Addressables.LoadAssetAsync<Object>(resourceLocation).Completed += (obj) =>
{
//Instantiate(obj.Result);
};
}
}
else
{
Addressables.Release(asyncOperationHandle2);
}
};
#endregion
#region 知识点五 根据资源定位信息加载资源的注意事项
//1.资源信息当中提供了一些额外信息
// PrimaryKey:资源主键(资源名)
// InternalId:资源内部ID(资源路径)
// ResourceType:资源类型(Type可以获取资源类型名)
// 我们可以利用这些信息处理一些特殊需求
// 比如加载多个不同类型资源时 可以通过他们进行判断再分别进行处理
//2.根据资源定位信息加载资源并不会加大我们加载开销
// 只是分部完成加载了而已
#endregion
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com