跳至主要內容

F15.AssetLoad的几种方法

Mr.Si大约 2 分钟u++

头像
资源加载的几种写法

前置

头像

食用本文建议先了解类和对象的介绍!直通车

异步

头像
这里主要记录一下UAssetManager的异步加载,异步加载一定要检查指针!对于高频加载操作千万别自己释放句柄!因为异步玩玩不是实时的,容易出现线程安全问题!
//定义句柄
TSharedPtr<FStreamableHandle> Handle;

TSoftObjectPtr<UInventorySubConfig> SubConfig;//如果是软引用,需要先ToSoftObjectPath(),使用需要先ToSoftObjectPath重载版本

const UInventoryTotalConfig* SubConfig;//如果是对象指针,可以直接放进去,会有对应的重载版本

//委托
FStreamableDelegate SubConfigLoadDelegate = FStreamableDelegate::CreateUObject(this, &你的类::回调函数, Index);

//异步加载
Handle = UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(SubConfig, SubConfigLoadDelegate);

Handle.isValid();//是否有效
Handle->HasLoadCompleted();//进度 
Handle.GetLoadedAsset();//获取资源
Handle.ReleaseHandle();//释放句柄

头像
对应的蓝图节点

问题

头像
为什么资产加载后不需要实例化?
头像

Handle->GetLoadedAsset() 返回加载完成的资产,已经是实例化的对象,它返回都是 uobject

头像
可是有时候我们会在这种资产中配置对象,这个对象为什么也被实例化了?
头像
你这个添加行为其实就是UE编辑器的实例化行为。比方说我们构造函数的ID是0,然后去蓝图中重写。
头像
如果说加载资产后才实例这个对象应该打印0,但实际是根据你蓝图中配置的5,这也验证了你加载资产是你蓝图派生的资产。
头像
难怪有时候我直接派生UObject的构造函数中打印会报错,因为引擎启动就加载所有UObject类,GEngine可能没实例化就调用导致指针悬挂问题。

同步

参考文档

https://www.cnblogs.com/shiroe/p/14710066.htmlopen in new window

官方文档open in new window

官方直播open in new window

https://qiita.com/Zi_su/items/81dc5b5e29a96ad2ceccopen in new window

https://jdelezenne.github.io/Codex/UE4/Assets%20Streaming.htmlopen in new window