[UE] アセットを非同期ロードと解放をする

今回は、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(ガベージコレクション)する必要があります。

エディターだと基本解放されないので注意

参考文献