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」変数、
あとは読み込み(ロード)完了時のコールバック関数を持つクラスを作ってみました。
上記クラスの変数と関数を使って非同期読み込み処理を書いてみます。
あとは読み込み完了時にアセットデータの取得などをコールバック関数を使って行います。
と、結構長くなってしまいましたが、この方法で複数アセットの非同期読み込みをすることができました。
もしかしたらもっとわかりやすい方法などあるかもしれないので、ちょこちょこと調べようと思います。
こちらを参考にさせていただきました。
・【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。本来はシングルトンなどでゲーム中に一つだけ存在するようにします。public:
FStreamableManager StreamableManager ;
// ロードハンドル
TSharedPtr< FStreamableHandle> StreamableHandle;
// ソフトオブジェクト(複数を同時に読み込みたいので TArray になっています)
TArray< FSoftObjectPath> LoadSoftObjectPathes;// 読み込み開始関数};
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↑