BLOGブログ

2015.12.04UE4UE/ C++

[UE4] ノードの入力ピンによって出力ピン等の内容を動的に変える仕組みについて ~実装例編~

改訂バージョン: Unreal Engine 4.21

こちらは UE4 Advent Calendar 2015 4日目の記事です。
プログラマ向けの内容となります。
解説編をまだ読んでいない方はコチラ


実装サンプル

今回は実装サンプルとして、以下のようなカスタムノードを作ってみました。

 

DynamicPinNode_04

こんなノードがあって、

 

DynamicPinNode_05

SampleDataA を選択すると、SampleDataSettingA を引数に取る設定コピーノードになります。
出力の型は SampleDataA のリファレンスです。

 

DynamicPinNode_06

同じような SampleDataB もあります。

 

DynamicPinNode_07

もちろん SampleDataA に対応するものに対して SampleDataB のものは入力できません。

 

これを実装すると、以下のようになります。
詳しい解説は大きくなりすぎるので割愛しますが、気になる方は読んでみてください。

 

まず、SampleData 系の定義です。

そして上で例に挙げたコピーノードを作成するノードクラスです。

こちらはエディタ時のみに使用するクラスになるので、プロジェクトのエディタモジュール側に定義します。
ちなみにエディタモジュールの実装に関してはコチラの記事を参考にして下さい。

 

また、カスタムノードを実装時には以下のように参照するモジュールを追加してあげる必要もありますのでご注意ください。

 

自作プラグインでの拡張事例

自分が個人で作成・公開している WebApi プラグイン というものがあります。
プラグインの内容は割愛しますが、こちらの実装でも今回の仕組みが活用されています。

 

WebApi クラスをインスタンス化する機能を提供する「Create WebApi」というノードがあります。
こちらは ConstructObjectFromClass とほぼ同機能のノードとなりますが、それに加えて以下の拡張が入っています。

  • 入力ピンのクラス指定候補に WebApi クラス or それを継承したものしか出てこない
  • 出力ピンのデフォルト型が WebApi クラスのリファレンスとなっている
    (動的に入力ピンのクラス指定が変わるような実装でも、WebApi クラスのAPIはキャストせずに使用できる)

DynamicPinNode_02

 

また、WebApiRequestBodyBase クラスをインスタンス化し、更にプロパティコピー元のインスタンスを指定が可能な「Create WebApiRequestBody」というノードも実装されています。

こういった感じに入力ピンは自由に増やすことが可能です。

DynamicPinNode_03