LoginSignup
0
0

【UE】SpawnActorでハード参照したくない

Last updated at Posted at 2024-03-27

備忘録です。

環境

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種類のみです。
そして、
sample.png
このようにスキルごとに何かしらのBPアクタを生成する必要があるとします。
この時、BPアクタクラスを直接SpawnActorノードのClassに指定するとハード参照になってしまいます。

結果、キャラクターをロードしただけで、使うかも分からない10種類すべてのBPアクタクラスがロードされてしまいます。(キャラクタークラス内で、スキルのBPアクタを生成する場合の話です。このコードの組み方が悪い可能性も大きいです。)

これを防ぐための方法として、FSoftObjectPathからBPアクタを生成するようにしました。
これによりソフト参照にすることができます。

注意

これは同期的な生成なので、ロードの結果処理速度が落ちる可能性があります。
その場合は非同期的な生成を試してみるといいかもしれません。
私は、事前に必要なアセットをロードしておきました。(最初に記述したコードからSpawnActor部分を消せばOK)

参考にさせていただいたサイト

[UE4] C++で動的にアクターを生成(スポーン)する方法で一番実用的だった方法
ハード参照とソフト参照 - おかわりはくまいのアンリアルなメモ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0