Unreal Engine - 別のBlueprintからBlueprintを呼び出す(CustomEvent使用)
コンポーネント内部からさらに別のコンポーネントを呼び出したいことは多々ある。
UnityでいえばSendMessageとかGetComponentからの他コンポーネントの抱える関数の呼び出しとか。
Blueprint Interfaceとかイベントディスパッチャとかあるようだが、色々試したところそれほど複雑でない処理ならCustomEvent使用が一番手軽かつ確実なのではないだろうか。
参考リンク
ブループリント通信の使用方法 | Unreal Engine
8 - Adding Interaction - YouTube
10 - Dynamic Material Instances, Part 2 - YouTube
やること
シーン中に設置してあるボタンを押すことでライトの色を変更する。
ボタン毎に変更後の色は異なる。www.youtube.com
全体構成
Light(のBP)を各Switch(のBP)で呼び出す。SwitchBPは全く同一のBPであり、保持する指定色変数が異なる以外は同じ挙動を行う。
LightBPは呼び出された時に引数で渡された色で色を変えることのみ行い、呼び出し元が何であるかは考慮しない。
スイッチ側の設定(RGB_LightSwitch_BP)
- スイッチとなるアクタを設置し、その周囲をTriggerBoxで囲う。
- 新変数として「NewColor(LinearColor)」「TargetLight(Actor)」を追加、公開してアクタのDetailsから設定できるようにする。
※DetailからNewColorに変更後の色を、TargetLightに変更対象となるLightのアクタを設定する。
Event Graph
- TriggerBoxへのBegin/EndOverlapを開始イベントとして入力受付の可否を設定する。
- Blueprint Interfaceやディスパッチャも少しいじったりしてみたが、単純な処理の場合はおそらくカスタムイベントで充分かと思われる(というかBPIF等はまだ理解してない)
- Key Inputを開始イベントとしてRGB_Light_BP(対象となるライトアクタのBP)へのキャストを作成する。対象となるObjectには変数Target Lightを接続し、さらにカスタムイベント「CE_ChangeLightColor」へと繋げる。
ライト側の設定(RGB_Light_BP)
- 他から呼び出されるカスタムイベントノード「CE_ChangeLightColor」を設置。そこからSetLightColorの処理を呼び出す。
- Targetは自身が抱えるLightComponent、指定するNewLightColorはカスタムノードから受け取ることができる。
※正確な順番としてはライト側でAdd Custom Event->CE_ChangeLightColor作成->CustomEventのDetails内Inputsに必要な変数情報を設定->Switch側からのCustomEvent呼び出しという形になる。
おまけ:スイッチアクタの色を変える
設定した色別にスイッチのシンボルの色を変更する
- Construction Scriptで色を変更するメッシュのマテリアルを取得する。今回の場合はDetails内のMaterials、Element 1を修正するのでIndexには1を指定。
- MaterialEditor内でシンボルの色を指定している部分を確認する。今回は「0.57,0.333,0.0342」というノードがオレンジ色を指定していると思われる。
- 現在色をしているConstant 3Vectorノードは名前の設定ができないため、新たにVector Parameterノードを作成、代わりとしてLerpに接続する。別に色はなんでもいいのだが、デフォルト値としてひとまず元ノードと同じ値を設定しておく。
- Construction Scriptの操作に戻る。Parameter Nameで変更するノード、この場合は新たに作成した「OrderColor」を取得し、ValueにNew Colorをセットする。
- 以上により、アクタのDetailsにてライトの新たな色を指定すると同時にシンボルの色も変わるようになる。