C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

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
  );

参考

  1. SpawnActor | Unreal Engine API Reference
  2. FObjectFinder | Unreal Engine API Reference
  3. AStaticMeshActor | Unreal Engine API Reference
  4. Spawning Actors - Unreal Engine Forums