Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 C++コードをブループリントで使えるようにする(アクタークラス編)

前回の記事でC++コードをブループリントで使えるようにする基礎的な内容を解説しました。

今回はC++を使ってアクタークラスを扱えるようにしてみたいと思います。前回の記事で解説した部分と重なる部分も多いので、まだ見ていない方は一度目を通してもらえるとわかりやすいと思います。

アクタークラスを作る前に

そもそもアクターというのはなんなのでしょう?よくアクターと同列に扱われるオブジェクトというものがありますが、UE4においてこれらは明確に定義があります。結論から言えばアクターもオブジェクトですが、オブジェクトはアクターではありません。

ではなぜオブジェクトが存在しているかと言うと、アクターはその名前の通り、ゲーム中において俳優となり、これはひとつの人物かのように扱います。オブジェクトは人ではない、服や靴や鞄と言ったコンポーネントとして扱います。

アクター自体は動きを制御したりしますが、オブジェクトはアクターのコンポーネントなので、そういったものが必要ありませんね。つまり、ワールド上に配置されるものは全てアクターとなりますが、そうでないものはオブジェクトだというわけです。

アクターの作成

それでは実際にアクターの作成に入りましょう。前回の記事を参考に"プロジェクトにコードを追加"を実行して、Actorを親クラスにしたものを追加してください。

今回はヘッダーファイルのクラス宣言を以下のようにしてみました。

UCLASS(Blueprintable, BlueprintType)
class CPPTEST_API AMyActor : public AActor
{
	GENERATED_UCLASS_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Level")
	int32 MyLevel;
	
	UFUNCTION(BlueprintCallable, Category = "Level")
	void PrintMyLevel();
};

順番に解説していきます。

UCLASSマクロ

UCLASSマクロはクラスに対するクラス指定子やメタデータをつけることによって、UE4の中で独自の情報を付加させることができます。ここでは最も重要なクラス指定子のこと解説します。もっと多くの情報が必要な方は公式のリファレンスを参考にしてください。

Unreal Engine | ゲームプレイ クラス

キーワード説明
Blueprintable ブループリントシステムにそのクラスを認識させて、新規ブループリント一覧の中に親として選択可能にします。この情報はサブクラスでも有効です
NotBlueprintable ブループリントシステムからそのクラスを隠蔽させて、新規ブループリントとして作成不可能なクラスにします。親クラスがBlueprintableであった場合はその効果を打ち消します。
BlueprintType ブループリントの変数として使用可能なタイプとしてクラスを公開します。
NotBlueprintType ブループリントの変数として使用不可能なタイプにします。

 NotBlueprintTypeはリファレンスにないのですが、使用可能ですので載せておきます。基本的にマクロの引数の順番は関係ないようです。相反するキーワード(Blueprintableなのに、NotBlueprintableも指定する)を使用しなければエラーにはなりません。

デフォルト値はよくわかりませんが、何も指定しなければBlueprintableやBlueprintTypeになっているような気がします。ただ、明確化のためにも指定子はしっかりとつけておきましょう。

今回はクラスとして公開するので、両方ともBlueprintableとBlueprintTypeを指定しています。

UPROPERTYマクロ

UPROPERTYマクロは変数に対する変数指定子やメタデータです。これも指定することによって変数に独自の情報を付加させることができます。今回は少し項目に分けて紹介します。もっと多くの情報が必要な方は公式のリファレンスを参考に。

Unreal Engine | プロパティ

プロパティ編集権限

キーワード説明
EditAnywhere エディターの中で、このプロパティを編集可能にします。
EditInstanceOnly [Details]タブのみ、このプロパティを編集可能にします。
EditDefaultsOnly ブループリントエディターの[Blueprint Defaults]モードでのみ、このプロパティを編集にします。 
VisibleAnywhere エディターの中で、このプロパティを表示のみで編集は不可能にします。
VisibleInstanceOnly [Details]タブで、このプロパティを表示のみで編集は不可能にします。
VisibleDefaultsOnly ブループリントエディターの[Blueprint Defaults]モードで、このプロパティを表示のみで編集を不可能にします。

 

 ブループリント上での読み取り、書き込み

キーワード説明
BlueprintReadOnly このプロパティをブループリント上でGetのみでSetは不可能にします。
BlueprintReadWrite このプロパティをブループリント上でGetもSetも可能にします。

 プロパティの編集権限とブループリント上での読み取り、書き込み可能の指定です。基本的にこれだけ抑えていれば扱う上では困らないと思います。どこまでを可能とさせるのかは設計をしながら考える必要があります。公開不可能にしていれば誤って変更する可能性も低くなりますから。

最後に"Category"がありますが、これは前回UFUNCTIONで紹介した時と同様です。Details(詳細)やDefaults(デフォルト)の中でカテゴリーとして分けられる時の名前ですので、自由につけることができます。

実際にコンパイルして実行してみる

では実際にこれらを使ってみます。新たに追加した関数、PrintMyLevel()の実装も載せておきます。

void AMyActor::PrintMyLevel()
{
	UE_LOG(LogBlueprintUserMessages, Log, TEXT("MyLevel: %d"), MyLevel);
}

単純にMyLevelというプロパティを表示しているだけです。この"UE_LOG"というマクロはあくまでも出力ログを表示するだけで、ゲーム中には何も表示させてくれませんので、注意してください。出力ログはエディターメニューのウィンドウで表示させるか、VisualStudioの出力ウィンドウに表示されています。

関数が追加できたらVisualStudioでF5を押して実行します。新規ブループリントで作成したActorクラスを親にしてブループリントを作成します。作成できたらそれをレベル上に配置します。

f:id:alwei:20140913160835j:plain

作成したブループリントを編集します。

f:id:alwei:20140913161015j:plain

これでゲームを実行してみると、MyLevelに20が設定されて、出力ログには"LogBlueprintUserMessages: MyLevel: 20"というような表示が出力されたと思います。

C++コードが実際に動いて、ブループリント上から制御できているということがわかりました。ここまでくればアクターに自由に機能を追加して、C++コードで実装を書きながら、ブループリントで制御するということが可能になったと思います。

素晴らしいことにUE4にはエディター実行中にC++コードを編集可能というホットリロードという機能もついています。上手く組み合わせれば、C++とブループリント、両方のいいところを使うことができるようになります。

ここから更に

UE4ではC++コードをプラグイン化して更に配布するといったことも可能です。まだまだおいしい機能が沢山ありますが、今回の解説はここまで。また解説してほしいものなどありましたらリクエストをください。