UE4: C++ コード から C++ クラスまたは Blueprint のアクターを FindObject して SpawnActor する方法
UE4/C++er も Blueprint クラスを C++ コードから使用する必要がある場合はまま生じます。C++で実装するよりも Blueprint で実装した方が都合の善いクラスを C++ で実装したクラスから扱いたい場合にどうするか、 SpawnActor する場合を例に、 C++ クラスを扱う場合と Blurprint クラスを扱う場合を並べて整理します。
0. 共通: FActorSpawnParameters
を定義する
FActorSpawnParameters params; // 必要に応じてパラメーターを設定する。 params.bAllowDuringConstructionScript = true; params.bDeferConstruction = false; params.bNoFail = true; params.Instigator = this; params.Name = { }; params.ObjectFlags = EObjectFlags::RF_NoFlags; params.OverrideLevel = nullptr; params.Owner = this; params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; params.Template = nullptr;
1. C++ クラスを SpawnActor (とても簡単)
// 事前に用意した params と必要な SpawnActor のオーバーロードを使う。 // ASomethingActor は必要に応じて #include "SomethingActor.h" など参照可能にしておく。 auto something = GetWorld()->SpawnActor< ASomethingActor > ( GetActorLocation() , GetActorRotation() , params );
2. Blueprint のアクターを SpawnActor (実装方法に少々癖がある)
仕込み
step.1 SpawnActor を行う C++ のアクタークラスの .h に SpawnActor される Blurprint クラスのオブジェクトを保持する仕込みを行う。
// StaticMeshActor を使いたい場合には必要 #include "Runtime/Engine/Classes/Engine/StaticMeshActor.h"
protected: // 例えば目的の Blurprint クラスが AStaticMeshActor ならそのオブジェクトの SpawnActor 用に参照させるオブジェクトの保持はこんな感じ。 // (よりゆるくは AActor* でもよい。) TSubclassOf< class AStaticMeshActor > something_object = nullptr;
step.2 SpawnActor を行う C++ のアクタークラスの .cpp の ctor で SpawnActor される Blurprint クラスを ConstructorHelpers::FindObject で取得し、オブジェクトを保持しておく仕込みを行う。
// ConstructorHelpers::FObjectFinder に必要 #include "Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h"
// ctor MyGameCharacter::MyGameCharacter() // コンテントブラウザーで /Content 以下のパスが /Game 以下のパスに置き換わり、 // コンテントブラウザーで名前が Something_Blueprint なら Something_Blueprint.Something_Blueprint_C が FindObject する名前になる。 // UE4/C++er は C++ コードから Blurprint クラスを参照する際は . で繋がり終わりに _C が付くルールを覚えておく必要がある。 static ConstructorHelpers::FObjectFinder< UClass > found_something_object( TEXT( "/Game/Something_Blueprint.Something_Blueprint_C" ) ); something_object = found_something_object.Object;
SpawnActor
// 仕込みで用意しておいた something_object を使う SpawnActor のオーバーロードを使う。 auto something = GetWorld()->SpawnActor< AStaticMeshActor> ( something_object // <-- ここで UClass* なオブジェクトを渡すために事前の仕込みが必要 , GetActorLocation() , GetActorRotation() , params );