ブループリント クイックショット⑤ ブループリントどうしの交信

ビデオの内容紹介 
ブループリント間でイベントを呼び出す方法を解説しています。1 つはレベルブループリントからクラスブループリントのイベントを呼び出し、もう 1 つはその逆を行います。

原題 Unreal Engine 4 Blueprint QuickShot – 5 – Communicating Between Blueprints

作るもの①
アクタをレベル内に配置して、キーボードの何らかのキーを押すことによってそのアクタが少しずつ上昇するブループリント。レベルブループリントからクラスブループリントにある関数 (イベント) を呼び出します

完成図①
500
完成図②
501
実行結果
513
留意点
① 完成図①の MoveBy は、カスタムのイベントです。カスタム イベントは、スペースを右クリックして、次の項目を選択して作成できます。
514
② 完成図①の MoveBy の Amount ピンは、MoveBy を選択状態にしてから、Details パネルの Inputs セクションの New を押すことによって作ることができます。Amount はその際に付けられた名前です。型は float を選択します。
511
③ 完成図②は、レベルブループリントで作成します。レベルブループリントを開くには、レベルエディタのツールバーで Blueprints をクリックして、Open Level Print をクリックします。

④ 完成図②を組み始める時に、まず、完成図①で作ったクラスブループリントをビューポート内にドラッグアンドドロップして、ビューポート内でそのアクタ (四角い物体) を選択状態にしておきます。
507
そうしておかないと、次のような Call Function on MoveBox (MoveBox 上の関数を呼び出す) が右クリックメニューに表示されません。
508

ブループリントの意味
完成図①の意味: クラスブループリント側
MoveBy (~分だけ移動させる) というカスタム イベントが発動すると Add Local Offset が発動します (カスタム イベントは、自由に名前を付けて、置かれているクラス以外から呼び出すことができます)。Add Local Offset の意味は、「ローカルの (=そのアクタを基準として) オフセット (=差分) を追加する」という意味です。この Add Local Offset によって Target につながっている Static Mesh 1 (ここでは SM_CornerFrame) が、差分がプラスされた位置に置かれることになります。

その位置は、Delta Location (差分位置) に供給された差分を加えられた位置となります。この Add Local Offset は、単に差分を加える計算をするだけではなく、その位置に Set する役割をもちます (このことは、以下の実験で分かります)。

その Delta Location (差分位置) に値を供給しているのが、Make Vector (ベクタを作る) です。Make Vector は (x, y, z) というベクタを作ります。この例では x と y にそれぞれ 0.0 が指定されており、z は MoveBy の Amount から値が供給されます。MoveBy の Amount に 20 が入れば (次の完成図②の意味を参照)、この z にも 20 が入るので、(0, 0, 20) というベクタができることになります。

これが差分となるので、その差分がアクタの元の位置に加えられて (Add) 新たな位置となり、そこにアクタを配置することになります。

完成図②の意味: レベルブループリント側
このグラフは、レベルブループリントから、クラスブループリントにあるカスタム イベント MoveBy を発動させるためのものです。 F キーにつながっているノードが、他のクラスブループリントにあるイベントを呼び出します。この Move Byノードの Target ピンには最初から MoveBox がつながっています。Move Byノードを作る時に Call Function on MoveBox (MoveBox クラスブループリントにある関数を呼び出す) というセクションに入っているからです。

また、Amount (量) は、MoveBox クラスブループリントにある MoveBy イベントの Amount に対応しています。ここに 20 という数字を入れると、MoveBox クラスブループリントにある MoveBy イベントの Amount に同じ値が入ることになります。

実験
Add Local Offset の動作を確かめるために、次のようなグラフを作りました。
502
これは、完成図①のところどころに Print String (文字列の出力) を加えただけのものです。出力される文字列は、順番に、MoveBy が呼び出された時のアクタ (四角の物体) の位置 → Make Vector で作られる差分ベクタ → Add Local Offset の処理がされた後のアクタの位置→ 「MoveBy」と表示することによって、「これで終わり」という目印にしています。結果は次のようになります (画面では下から順番に見てください)。
503
最初に F キーが押されると、初期位置が (-811.000, -323.000, 125.000) です。次に Make Vector で (0, 0, 50) ができて、それが加わって、(-811.000, -323.000, 175.000) という新たな位置にアクタが置かれます。MoveBy が表示されたので、ここで 1 回目の F キーから始まる処理が終わります。以降、再度 F キーが押されて、繰り返されています。

次のようなグラフを作っても同じことができます。これも Print String が入っていますが、根は単純なグラフです。
504
このグラフの意味は、JikMove (実験 Move) というカスタム イベントが発動すると、まずアクタの初期位置が表示されます。次に、Set Actor Location によって新たな位置をセットしてアクタをその位置に動かします。新たな位置は、New Location に供給される値です。それは、Get Actor Location でその時の位置を取得して、それに (0, 0, 50) を + したものです。Set Actor Location の処理が終わると、さっそくその新たな位置を Print String で表示しています。最後に JikMove と表示して、一連の処理が終了したことを示します。結果は
次のようになります (画面では下から順番に見てください)。
505
最初に V キー (後のグラフ参照) が押されると、初期位置が (-811.000, -323.000, 125.000) です。これは先の結果と同じです。次に (0, 0, 50) が加わって、(-811.000, -323.000, 175.000) という新たな位置にアクタが置かれます。これも先の結果と同じです。JikMove が表示されたので、ここで 1 回目の V キーから始まる処理が終わります。以降、再度 V キーが押されて、繰り返されています。

これらの処理が開始されるのは、レベルブループリントに次のようなグラフがあるためです。
506

作るもの②
アクタ (四角い物体) にキャラクターがコリジョン (衝突、接触) すると Ouch (痛い) が表示されます。今度は、クラスブループリントからレベルブループリントの関数 (イベント) を呼び出します。

完成図③ クラスブループリント側
509

完成図④ レベルブループリント側
510

実行結果
515

留意点
① 完成図③の Call YouHitMe (君は僕にぶつかった) の作り方: My Blueprint パネルの Event Dispatcher (イベント ディスパッチャ=処理の振り分け) をクリックして、YouHitMe という名前を付け、それをグラフにドラッグアンドドロップして、call を選択します。
② 完成図④の YouHitMe の作り方: レベルエディタのビューポートでアクタ (四角い物体) を選択状態にしておき、イベントグラフ内のスペースで右クリックして、Add YouHitMe を選択します。
512

ブループリントの意味
完成図③の意味: クラスブループリント側
Event Hit は、この (このクラスブループリントの主の) アクタ (四角い物体) に何かがぶつかった時、またはこのアクタが何かをブロックした時に発動するイベントノードです。今回の例では、キャラクターがこのアクタにぶつかることを想定しています。

Event Hit が発動すると、それにつながる Call YouHitMe が発動します。このノードは、Event Dispatcher なので、他のイベントを呼び出します。つまり、Event Dispatcher は、呼び出された時点で、これに結び付けられているイベントが呼び出されることになります。その結び付けられたイベントは次をご覧ください。

完成図④の意味: レベルブループリント側
YouHitMe (MoveBox) が、Event Dispatcher によって呼び出されるイベントです。これが発動すると、それにつながっている Print String が実行され、Ouch と表示されます。

今回はこれで終了です。ありがとうございました。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする