ビデオの内容紹介
あるブループリントが他のブループリントに影響を及ぼすようにさせる方法を、2 つの例を挙げて解説しています。
原題 Unreal Engine 4 Blueprint QuickShot – 9 – More Blueprint Communication
作るもの①
球体にぶつかると (コリジョンすると) 低木が空中に持ち上がるブループリントを作ります。
ブループリント作成の注意点と意味①
① 両方とも Props で SM_Bush と MaterialSphere を右クリックして、ブループリントを作ります。名前はそれぞれ、ShrubMove (低木が動く) と ShrubMover (低木を動かすもの) です。
ShrubMover では、Components モードにして、球体を選択状態にした上で、Details タブの Collision セクションで Collision Presets を OverlapAll にしておきます。これによって、キャラクターがこの球体とオーバーラップすると (接触すると) 反応するようになります。
② ShrubMove の方のブループリントで、MoveUp はカスタムイベントです。スペースで右クリックして検索欄で custom event と打つと、カスタムイベントを作ることができます。Add Actor Local Offset 関数は、アクタの位置の座標に何らかの値 (差分=offset) を加えるものです。ここでは、z (上下方向) に 50 を加えています。なお、マイナスの値を加えることもできます。その場合、低木は下に沈みます。
カスタムイベントは、他のブループリントから呼び出すことができます (この場合は、ShrubMover から呼び出しています)。MoveUp が発動すると、すぐに Add Actor Local Offset 関数が発動して低木の z 位置を上昇させます。
③ ShrubMover の方は、Event Actor Begin Overlap (アクタが範囲に入ってくると発動するイベント) が発動すると、ShurubToMove (動かすべき低木) という ShrubMove_C 型の変数が有効であるかどうか (実際にレベルに配置されている低木 (ShrubMover) がこの変数に割り当てられているかどうか) を IsValid (有効か) ノードで検証して、有効な場合 (右側の Is Valid) は、ShurubToMove のもっている関数 (イベント) MoveUp を呼び出します。
なお、ShurubToMove は、My Blueprint パネルの +Variable をコリジョンして、Shurub To Move という名前を付け、Details パネルの Variable Type (変数の型) から object をクリックして、ShrubMove_C を選択します。
また、ShurubToMove は、My Blueprint パネルで目のアイコンをクリックしておきます。これによって、レベルエディタ上にエクスポーズされる (顕在化される) ようになります。レベルエディタでは、球体を選択すると、Details タブの Default セクションに ShurubToMove がエクスポーズされているのが分かります。
最初は、ShurubToMove の値が None (なし) になっています。
右横のピンのアイコンをクリックしてから、ビューポート内の低木を選択すると、
ShurubToMove の値が ShrubMove に変わるのが分かります。
これによって、ShurubToMove という変数が、この ShrubMove という低木のことであることをはっきさせることができました。ちなみに、もう一つ低木を配置するために、ShrubMove ブループリントをビューポート内右側にドラッグアンドドロップして、この低木を ShurubToMove に指定する実験をしてみました。すると、ShurubToMove の値は ShrubMove_2 になり、
ゲームを実行すると、次のように右側にある ShrubMove_2 の方が上昇するようになりました。
キーワード クラス / インスタンス / アクタ
上記で作ったブループリントはクラス (クラスブループリント) であり、クラスとは設計図のことです。具体的なものはインスタンス (例) と言いますが、それがブループリントをドラッグアンドドロップしてできるものです。つまり、インスタンスとはクラスから作られるものです。だから、上記の実験のように、1 つのクラスから好きなだけインスタンスを作ってレベルに配置することができます。
インスタンスはオブジェクト (実体化された「もの」) とも言います。このようなクラスとインスタンス (オブジェクト) の関係はオブジェクト指向のコンピュータ言語で一般的なものですが、ブループリントの場合はこのことが視覚的に操作できるため、特にオブジェクト指向に関する知識がなくてもやっていけそうです。
なお、このように配置されたインスタンスをアクタと言います。以前、(「レベルを作る② ジオメトリの配置」)でアクタのことを、「レベルに置くことができるキャラクターや物のことです。(中略)プログラミング的な観点で見た場合に使われる言葉です」と書いたことがありますが、このようなクラス – インスタンス関係を踏まえてのことでした。
作るもの②
球体にオーバーラップすると、レベル内の低木すべてが位置を変えるブループリントを作ります。object 型の変数を使わずに実現します。
ブループリント作成の注意点と意味②
① ShrubMove のブループリントは、完成図①と異なり (チュートリアルと異なり)、あえて Delta Location に -50 を入れています。実行すると、低木がフロアの下に沈んで行きます。
② ShrubMover の方は、先の ShrubMover とは、Event Actor Begin Overlap のノードと Move Up 呼び出しノードの間がまったく異なります。
球体とキャラクターがオーバーラップすると、Get All Actors Class (すべてのアクタクラスを取得する) が発動します。Actor Class の欄には ShrubMove_C を選択しているので、ShrubMove クラスによって作られたすべての ShrubMove インスタンス (オブジェクト) が検索され、配列に入れて返されます。
その配列の個数分、 ForEachLoop で処理がループされます。その処理とは、Loop Body につながっているものです。つまりここでは Cast To ShrubMove です。
Cast To ShrubMove は、ShrubMove のもつ関数、変数を使用できるようにするためのものです。ですからここに MoveUp を呼び出すノードがつながっています。
今回は以上です。お疲れ様でした!