はじめに
今回はブループリントを使ってステージ上の仕掛けを作っていきます。ゲームの実装部分で一番面白いところかもしれません。
ただしブループリントの機能を使いこなすためには、今回登場するカスタムイベントやイベントディスパッチャーの理解は不可欠です。
本記事の最後には復習もありますので、ブループリントのルールに慣れるまでゆっくり進めてみてください!
第15章 トリガーを使ったインタラクションの実現
15.2.1 簡単なプレイヤーキャラの死亡処理を準備する
旧)[イベントを追加]>[Damage]>[イベント AnyDamage]を選択します。
新)[イベントを追加]>[ゲーム]>[ダメージ]>[Event AnyDamage]を選択します。
※検索欄に「AnyDamage]と入力するとすぐ見つけられます。
15.2.2 トリガーをレベルブループリントで利用する
15.2.3 アクタにトリガーをとりつける
15.3.1 アクタを消滅させる
PNPickupCoinActorのブループリントを作成する際も、詳細ダイアログが表示されます。今回は親クラスの指定をStaticMeshActorになっていることを確認して、作成してください。
15.3.2 ゼロからアクタを構築する
本書の説明では、[コンポーネントを追加]から[Scene]を追加すると、[DefaultSceneRoot]と置き換わるように書かれていますが、最新版では[DefaultSceneRoot]の子として追加されます。
本書のように先頭に[Scene]コンポーネントを[DefaultSceneRoot]と置き換える場合は、[Scene]コンポーネントを[DefaultSceneRoo]にドラッグ&ドロップすれば可能です。

手順9でBox Collisionを追加する際に、コンポーネントウィンドウのどのコンポーネントが選択状態だったかによって、何のコンポーネントの子として追加されるかが変わります。今回はSceneRootの子として追加します。
15.3.3 初めてのブランチ
ブランチノードは、最新版ではBranchノードと表示されています。
第16章 タイムラインを使ってアクタやコンポーネントを動かす
16.2 初めてのタイムライン
アクションリストの[タイムラインを追加する…]は、最新版では[Add Timeline…]と表示されています。
16.2.2 タイムラインの値を活用する
手順5の、[Math]>[Rotator]>[Make Rot]ノードは、最新版では[演算]>[Make Rotator]から選択します。またこのノードは[Set Relative Rotation]ノードの[New Rotation]入力ピンからワイヤーを伸ばしたときしか表示されません。本書をよく読んで間違えないようにご注意ください。
16.3.3 Lerpノードを使う
旧)[Math]>[Vector]>[Lerp (Vector)]ノードを設置します。
新)[演算]>[ベクター]>[Lerp (Vector)]ノードを設置します。
※検索欄に[Lerp]と入力するとすぐに見つけられます。
16.4.1 ふすまの構造を準備する
本書では[Arrow]コンポーネントをルートにしていますので、作成時に[DefaultSceneRoot]にドラッグ&ドロップしてルートにします。
また、スタティックメッシュコンポーネントを4つ作成する際に、スタティックメッシュ同士が親子関係にならないように注意してください。すべて[Arrow]コンポーネントの子にします。
16.4.2 Vectorトラックでキーを打つ
[Timeline]ノードの応用編です。途中でうまくいかなくなった場合は[Timeline]ノードを作り直して一からやってみてください!何度もやればその分理解できます。手順6で [Vector * Vector]ノードを追加する際には、検索欄に [*] と入力するとすぐに見つけることができます。
完成後に実際にレベルに配置して動作確認する際に、Arrowの向きを見ることでアクターの向きがどちらを向いているか判別することができます。もし向きが反対の場合は、アクターの回転のZ軸に180を入力すると向きを変えることができます。
第17章 カスタムイベントを使いこなす
17.2.1 初めてのカスタムイベント
カスタムイベントを追加する
アクションリストの[カスタムイベントを追加…]は、最新版では[Add Custom Event…]と表示されています。
カスタムイベントを追加する機会は今後も多いのですが、右クリックから毎回[Add Custom Event…]を探していると時間がかかります。右クリックのあと、キーボードで [cus]と入力すれば[Add Custom Event…]を絞り込んだ状態になるので手早く追加することができます。(こういう時短テクニックは色々あります)
カスタムイベントの名前を変更する
カスタムイベントのノードを選択した状態で、詳細ウィンドウ上で変更してもいいですが、[F2]キーを押すと名前変更モードになるので手早く変更できます。
[BeginPlay]に繋がっているノードを[Open]イベントに付け替える。
[BeginPlay]イベントに繋がっている実行ピンを[Ctrl]キーを押しながら左クリックを押したまま(左ドラッグ)にすると、ノードをつまんだ状態になります。そのまま[Open]イベントのピンに繋ぐことで簡単にノードを繋ぎ変えることができます。17.2.3 カスタムイベントを呼び出す
旧)[入力]>[キーイベント]>[O]キーを選択して、
新)[インプット]>[Keyboard Events]>[O]キーを選択して、
レベルブループリントにPNGateActorのリファレンスを作成する
[PNGateActorのリファレンスを作成]は、[Create a Reference to PNGateActor]と表示されていることがあります。
慣れるまでは忘れやすいのですが、レベルブループリント上でレベルに配置したアクターのリファレンスを作成するには、エディタ上でそのアクターが選択状態になっている必要があります。そうなっていなければ、右クリックしても[PNGateActorのリファレンスを作成](もしくは[Create a Reference to PNGateActor])がメニューに出てきませんのでご注意ください。
17.3 イベントディスパッチャーで独自のイベントを発行する
イベントディスパッチャーはブループリント同士の連携をする上で非常に重要な要素ですので是非マスターしましょう!
この記事の最後にちょっとした解説をつけましたので、もしうまく理解できない場合はとりあえず最後まで手を動かしたあとに読んでみてください!
17.4.3 スイッチに「TurnOff」を追加する
カスタムイベント「TurnOff」を追加する
復習ですが、[TurnOff]というイベントがあらかじめ用意されているわけではありません。右クリックメニューから[Add Custom Event…]を選択し、新規カスタムイベントを追加したうえで名称を[TurnOff]に変更してください。
[Direction]出力ピンから列挙型でフロー制御する
旧)[ユーティリティ]>[フロー制御]>[切り替える]>[ETimelineDirectionをオン]を選択します。
新)[ユーティリティ]>[フロー制御]>[Switch]>[Switch on ETimelineDirection]を選択します。
17.4.4 時間で戻るスイッチを追加する
DelayのあとにFusuma02 Switchの[TurnOff]イベントを呼び出す
Fusuma02 Swichには[TurnOff]というカスタムイベントと、[OnTurnedOff]というイベントディスパッチャーがありますので間違えないように注意ください。ここでは[TurnOff]カスタムイベントを呼び出します。
今回の復習
今回はカスタムイベントとイベントディスパッチャーという2大機能が登場し、言われるがままにブループリントを作ってきました。
少し難しい箇所もあったので、一度今回の実装をまとめてみたいと思います。
やりたかったこと
床に仕掛けられたスイッチを踏むと、ふすまが開く仕掛けを作りました。追加機能として、5秒後に自動的にふすまが閉じるようにしました。
今回の登場人物

今回登場したのは、ふすまを開くスイッチである[PNSwitchActor]、ふすま本体の[PNGateActor]、ステージ管理人である[PNStage01_GB]です。
[PNSwitchActor]と[PNGateActor]はクラスブループリントで、[PNStage01_GB]はレベルブループリントです。以後、[PNSwitchActor]をスイッチ、[PNGateActor]をふすま、[PNStage01_GB]をレベルと呼びます。
疑問
初めてこの章を勉強したとき、私は以下のような疑問を持っていました。
ルール・制約
ブループリントには以下のようなルールがあります。
- 《ルール1》マップ上のアクター同士は、互いに相手の参照を知らない
参照を知らないということは、相手のイベントを呼び出すことができないということです。このルールによって、《疑問1》に挙げたような、マップ上に配置されたスイッチはふすまの[Open]イベントを直接呼び出すことができません。
実はアクターから他のアクターの情報を知る手段は用意されているのですが、原則としてはアクター同士は赤の他人状態です。このため、アクターAをきっかけとしてアクターBのイベントを呼ぶ場合は、一般的にレベルブループリントを経由します。 - 《ルール2》マップ上のアクターはレベルの参照を得られないが、レベルからアクターの参照は得られる
スイッチやふすま等のアクターは、他のアクターを知らないだけでなく、自分を管理するレベルに対してもイベントを呼び出すことができません。しかしステージ管理人であるレベルは、自分のマップに存在するアクターの参照を得ることができます。この仕組みを利用して問題を解決するのが《疑問2》で挙げた、イベントディスパッチャーです。
カスタムイベントとイベントディスパッチャーの違い
カスタムイベントを呼び出したい場合、呼び出す相手の参照が必要になります。電話をかけるために相手の連絡先が必要なイメージです。その特定の相手に対して「扉を開けて!」と指示を出します。
イベントディスパッチャーの場合、自分は他の相手がいようがいまいが、「僕のスイッチがオンになりましたぁぁあ!!」と叫んでるイメージです。ただ叫んでいるだけなので、相手の参照が必要というわけではありません。
実際の処理としては、スイッチの下図の部分です。

赤線で囲まれた[Call On Turned On]は[OnTurnedOn]イベントディスパッチャーを呼び出すという意味で、Target(対象)はself(自分)になっています。
この処理だけでは、ただ自分自身が「On Turned On!」と叫んでいるだけで何も起こりません。

イベントディスパッチャーで重要なのは、相手が自分のことを知っていれば、自分の声をきっかけに動き出してくれるということです。
一番伝えたい相手であるふすまは、アクター同士なのでスイッチの参照を得られませんが、レベルは管理人なのでスイッチとふすま両方の参照を得ることができます。
そこでレベルがスイッチのイベントディスパッチャーの聞き手となり、スイッチの叫び声をきっかけにふすまのカスタムイベントを呼んであげるのです。

実際の処理としては、レベルブループリントの下図の部分です。

このように、マップ上のアクターの出来事をきっかけに他のアクターを動かしたい場合、レベルを経由するという組み方はステージ制作の基本的な考え方となります。
まとめ
これでカスタムイベント編は終了です!
今回学んだ範囲はブループリントの実践的なテクニックですので、ぜひ理解できるまで何度もチャレンジしてみてください!私は理解するまで結構苦労しました!

おねがい
学習の際にわかりにくいと感じたことや躓いてしまった箇所がありましたら是非教えてください!
あなたのノウハウを記事に反映することで、次に学習する方の手助けになります!記事のコメントやTwitter等でご連絡ください~!