今回は、TSoftObjectPtrとFStreamableManagerによる
ロードと解放をメモしておきます。
PrimaryDataAssetの方法もありますが、今回の方法がよりシンプルな気がしてます。
非同期ロードする
複数アセットのロードに対応していません。
これについて記事作成予定
#include "Engine/StreamableManager.h"
// ロードする対象
UPROPERTY(EditAnywhere)
TSoftObjectPtr<UObject> AssetToLoad;
// ハンドル
TSharedPtr<FStreamableHandle> StreamableHandle;
#include "Engine/AssetManager.h"
// TSoftObjectPtrにあるFSoftObjectPathを使う
const FSoftObjectPath AssetPath = AssetToLoad.ToSoftObjectPath();
if (AssetPath.IsNull())
{
// ロードするパスが無い
return;
}
// 非同期ロード開始
FStreamableManager& StreamableManager = UAssetManager::GetStreamableManager();
StreamableHandle = StreamableManager.RequestAsyncLoad
(
AssetPath,
FStreamableDelegate::CreateLambda([this]()
{
UObject* Loaded = AssetToLoad.Get();
if(Loaded)
{
// ロード成功
}
})
);
この方法はロードがキャンセルや失敗された場合を考慮されていません。
これについても記事作成予定
開放する
if (!StreamableHandle.IsValid())
{
// ハンドルが無い
return;
}
// 解放
StreamableHandle.Reset();
Reset() はハード参照を外すだけで、即座に開放されません。
即座に開放したい場合はGC(ガベージコレクション)する必要があります。

