備忘録です。
環境
UnrealEngine 5.32
Visual Studio 2022
ブループリントのアクタをSpawnActorノードのClassに指定するとハード参照になる!ソフト参照にしたい!
結論として、
AActor* ACPP_SpawnActor::SyncSpawnActor(FSoftObjectPath softpath, FTransform transform)
{
FString path = softpath.ToString();
path += FString("_C");
TSubclassOf<class AActor> ActorClass = TSoftClassPtr<AActor>(FSoftObjectPath(*path)).LoadSynchronous();
if (ActorClass != nullptr)
{
AActor* createdObj = GetWorld()->SpawnActor<AActor>(ActorClass, transform);
return createdObj;
}
return nullptr;
}
c++で以上のように記述し、ブループリントのアクタを生成するタイミングでSyncSpawnActorにブループリントのアクタのパスを指定して呼び出すだけです。
pathに"_C"を追加しているのは、ブループリントのアクタの仕様?らしいです。
一応公式のドキュメントにもそのような記述があります。
何故こうする必要があったのか?
例えば、ゲームのキャラクターが10種類のスキルを扱えるとします。
しかし、実際にバトルシーンなどで使うのは装備した3種類のみです。
そして、
このようにスキルごとに何かしらのBPアクタを生成する必要があるとします。
この時、BPアクタクラスを直接SpawnActorノードのClassに指定するとハード参照になってしまいます。
結果、キャラクターをロードしただけで、使うかも分からない10種類すべてのBPアクタクラスがロードされてしまいます。(キャラクタークラス内で、スキルのBPアクタを生成する場合の話です。このコードの組み方が悪い可能性も大きいです。)
これを防ぐための方法として、FSoftObjectPathからBPアクタを生成するようにしました。
これによりソフト参照にすることができます。
注意
これは同期的な生成なので、ロードの結果処理速度が落ちる可能性があります。
その場合は非同期的な生成を試してみるといいかもしれません。
私は、事前に必要なアセットをロードしておきました。(最初に記述したコードからSpawnActor部分を消せばOK)
参考にさせていただいたサイト
[UE4] C++で動的にアクターを生成(スポーン)する方法で一番実用的だった方法
ハード参照とソフト参照 - おかわりはくまいのアンリアルなメモ