fc2ブログ

凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ

2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用ブログです。ゲーム制作に関するメモや雑記とか色々あります。C++ での Qt、Unity もほんの少しあります。

PREV | PAGE-SELECT | NEXT

≫ EDIT

UE5/UE4 C++で複数のアセットファイルを非同期読み込み(ロード)する(RequestAsyncLoad、FStreamableManager、FStreamableHandle、FSoftObjectPath)

C++で複数のアセットファイルを非同期読み込み(ロード)する方法です。

こちらを参考にさせていただきました。

・【UE4】同期的なアセットのロード方法とデメリット
https://qiita.com/4_mio_11/items/00de94dbb6b6ed59176f

・(UE4 4.20) UE4 synchronous loading and asynchronous loading UObject ----------LoadObject, LoadClass, FStreamableManager
https://blog.karatos.in/a?ID=00850-b316c715-b75c-4f8b-b2b4-1f35208560dd

・Assets Streaming
https://jdelezenne.github.io/Codex/UE4/Assets%20Streaming.html

・【UE4】StreamableManagerについて
https://qiita.com/pino_tabetai/items/abd66146d9340d10ebb6

複数ファイルの非同期読み込みは「FStreamableManager」を使います。
「FStreamableManager」の「RequestAsyncLoad」関数に
複数の「FSoftObjectPath」でアセットを渡すことで非同期読み込みを実行
できます。

まずは複数アセットの「FSoftObjectPath」変数とロードハンドルの「FStreamableHandle」変数、
あとは読み込み(ロード)完了時のコールバック関数を持つクラスを作ってみました。

// 読み込み用の変数とコールバック関数を保持するクラス(割と適当です)
UCLASS()
class ULoadClass : public UObject
{

GENERATED_BODY()
public:
// FStreamableManager。本来はシングルトンなどでゲーム中に一つだけ存在するようにします。
FStreamableManager StreamableManager ;
// ロードハンドル
TSharedPtr< FStreamableHandle> StreamableHandle;
// ソフトオブジェクト(複数を同時に読み込みたいので TArray になっています)
TArray< FSoftObjectPath> LoadSoftObjectPathes;
public:
// 読み込み開始関数
void BeginLoad();
// 読み込み(ロード)完了コールバック関数
void OnLoadCompleted();
};


上記クラスの変数と関数を使って非同期読み込み処理を書いてみます。

// 非同期読み込み開始関数
void ULoadClass ::BeginLoad()
{

// FStreamableManager を取得。本来はどこかに一つだけ保持しているものを取得する。
FStreamableManager& aStreamableManager = StreamableManager;

// 読み込みたいアセットのパスを登録
LoadSoftObjectPathes.Add(FSoftObjectPath("/Game/DataTable/DT_NewDataTable.DT_NewDataTable"));
LoadSoftObjectPathes.Add(FSoftObjectPath("/Game/DataTable/DT_OldDataTable.DT_OldDataTable"));


// 非同期読み込み開始とロードハンドルの取得。読み込み完了時のコールバック関数も登録
StreamableHandle = aStreamableManager.RequestAsyncLoad(
LoadSoftObjectPathes, FStreamableDelegate::CreateUObject(this, &ULoadClass ::OnLoadCompleted)
);
}

これで非同期読み込みの実行自体は完成です。

あとは読み込み完了時にアセットデータの取得などをコールバック関数を使って行います。

// 読み込み完了コールバック関数
void ULoadClass::OnLoadCompleted()
{

// 非同期読み込みを実行した UDataTable アセットを取得する。
// 一つ目のアセット
TSoftObjectPtr< UDataTable> aNewDataTablePtr;
aNewDataTablePtr = TSoftObjectPtr< UDataTable>(LoadSoftObjectPathes[0]).Get();
TObejctPtr< UDataTable> aNewDataTable = aNewDataTablePtr .Get();

// 二つ目のアセット
TSoftObjectPtr< UDataTable> aOldDataTablePtr;
aOldDataTablePtr = TSoftObjectPtr< UDataTable>(LoadSoftObjectPathes[1]).Get();
TObejctPtr< UDataTable> aOldDataTable = aOldDataTablePtr .Get();

// 非同期読み込み終了
StreamableHandle .Reset();
}


と、結構長くなってしまいましたが、この方法で複数アセットの非同期読み込みをすることができました。
もしかしたらもっとわかりやすい方法などあるかもしれないので、ちょこちょこと調べようと思います。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

COMMENT















非公開コメント

TRACKBACK URL

http://kagring.blog.fc2.com/tb.php/777-46c5a1ce

TRACKBACK

PREV | PAGE-SELECT | NEXT