Topic 4 オブジェクトに演出を追加してみよう!
ブループリントを活用し直感的に演出を作成
ここではBPのコンポーネントとビジュアルスクリプティング機能を使って、オブジェクトの掴んだ際の演出をつくってみます。従来の開発環境では何かのアクションに紐付いた演出、例えばモデル変更やエフェクト生成をさせようとした場合、大量の英語で構成された複雑なソースコードを書く必要があったため、アーティストやプランナーはプログラマーの手が空くまで待つ必要がありました。しかし、UE4のBPはソースコードに比べて直感的に処理のながれを実装できるため、プログラマーの手を借りずとも追加・変更作業を進めることができます。イテレーションをどれだけ早く回すことができるのかが重要になる近年のコンテンツ開発においてこの利点は効果的であり、コンテンツのクオリティ向上に大きく貢献します。
BPの基本操作
-
BPではエディタの「イベントグラフ」にてノードと呼ばれるブロックを配置し、その配置したノード同士を線で繋げることで処理のながれを構築していく
-
線を繋ぐ際はノードの右端にあるピンをクリックし、その状態で別のノードの左端にあるピンまでドラッグし指を離す。新しくノードを配置する際は空いている箇所で右クリックすると、ノードの追加メニューが表示される
そして、そのメニューの中から使用したいノードを選択してイベントグラフ内にノードを配置する。なお、ノードの配置メニューはピンから線を伸ばす途中で指を離した際も表示される
赤色のイベントノードは、【上の画像】のように何かのイベント(例:スペースキーを押した。キャラクターがジャンプした)が発生した際の処理のスタート地点になる。青色の関数ノードではこのノードを通過するとそのノードに応じた処理が行われる。緑色のPureノードでは主にTargetに指定されたBPがもつパラメータを取得する。ほかにもノードの種類はあるが、基本的にはこれらの3つのノードを組み合わせて処理を組む
オブジェクトを掴んだときに色を変更する
-
BP_PickupCubeにはPickUpイベントとDropイベントが用意されている
-
今回は掴まれた際の処理を編集するため、Pickupイベントにノードを追加する。まず、エディタ左上にあるStaticMeshComponentを選択し、空いている箇所にドラッグ&ドロップしてコンポーネントのノードを配置する。次に、そのノードから線を伸ばし空いている箇所で離すことでノード選択メニューを表示し、検索欄に「set material」と入力する
そして、検索結果の中から「Set Material」を選択しノードを追加する。最後に追加したノードとAttachToComponentノードを繋ぐ
これで、掴まれた際に見た目が変化するようになり、どれを掴んでいるかの判別がしやすくなる
離した際に元に戻したい場合は同様の処理をEvent Dropノードに追加する
オブジェクトを掴んだときに炎のエフェクトを出す
特定のタイミングでオブジェクトを生成する処理を実装する場合、事前に用意したコンポーネントを有効にする方法とSpawn系ノードでその都度生成する方法の2種類がある。ここでは前者の方法について解説する
-
まず、エディタ左上にある「コンポーネントを追加」からParticle Systemコンポーネントを追加する。次に、追加したParticle Systemコンポーネントを選択した状態で、エディタ右の詳細パネルにあるTemplateにP_Fireアセットを指定する
-
この状態だと掴む前から炎のエフェクトが表示されてしまうため、Auto Activeのチェックを外しておく
-
そして、Particle Systemコンポーネントのノードを配置し、さらにそのノードからSet Activeノードを配置する。Set Activeノードがもつチェックボックスには全てチェックを付けておく
-
これでノードの処理が走った際に炎のエフェクトが再生されるようにする。最後に、Event Pickupノードの処理にSet Activeノードを繋ぐことで、掴んだ際に炎のエフェクトが再生されるようになる
Topic 5 入力に応じて別のオブジェクトを生成しよう!
トリガー入力に対応して銃弾を生成する処理の実装
ここでは、掴んでいるオブジェクトから別のオブジェクト(銃弾)を生成する処理を実装していきます。この処理と前節で解説した処理を応用することで、様々な表現が可能になります。まずは同じ手順で処理を実装してみて、その後Particle Systemコンポーネントを追加するなどの改造をご自身で試してみると、理解がより深まるのでオススメです。
最後に別のプロジェクトからアセットを流用する手順について説明します。UE4には数多くの公式サンプルプロジェクトが用意されています。それらのプロジェクトに含まれる高品質なアセットを取り込むことで、コンテンツのクオリティを高めつつ、そのアセットから様々なノウハウを学ぶことができます。商用コンテンツでも利用可能ですので、ぜひご活用いただければと思います。ただし、アセットの再頒布は禁止されていますのでご注意ください。
生成するオブジェクトのBPを作成
ここではBP_PickupCubeから生成するオブジェクトのBP(BP_Bullet)をつくる。まず、コンテンツブラウザの右クリックメニューにある「ブループリントクラス」を選択し、その後表示されるダイアログ内の「Actor」を選択してBPを作成。作成したアセット名を「BP_Bullet」にする【画像左】。次に、作成したBPアセットをダブルクリックしてエディタを開き、「コンポーネントを追加」から「Projectile Movement」、「球」を選択して各コンポーネントを追加する。そして、追加されたSphereコンポーネントをDefaultSceneRootコンポーネントにドラッグ&ドロップすることでSphereコンポーネントをルートにする。さらに、Sphereコンポーネントを選択し、詳細パネルの「Simulate Physics」を有効にする。最後に、Projectile Movementコンポーネントを選択し、詳細パネルにある「Initial Speed」、「Max Speed」の値を調整する【画像右】 。これらの操作を行うことで、生成後にまっすぐ飛んでいくオブジェクトが完成する
オブジェクトを生成する処理の作成
ここではBP_PickupCubeから先ほど作成したBP_Bulletを生成する処理を実装する
まず、BP_PickupCubeにBP_Bulletの生成位置・向きを調整するためのArrowコンポーネントを追加する
追加後、エディタのビューポートタブを開き、Arrowコンポーネントを選択した際に表示されるギズモを用いてArrowコンポーネントの位置・向きを調整する。次に、イベントグラフのノード追加メニューの「Add Custom Event」を選択し、新規のイベントノードを追加して「Grip Action」という名前にする
そして、ノード追加メニュー「Spawn Actor From Class」を選択し、追加されたノードのClassにBP_Bulletを指定する。最後に、SpawnActorノードのSpawn TransformにArrowコンポーネント用のノード追加メニューから追加したGetWorldTransformノードを接続する。これで追加したイベントが呼ばれると、BP_Bulletを生成する処理が行われる
入力イベントにオブジェクトの生成処理を紐付け
ここでは、ハンドコントローラの入力が行われた際に、各BPを経由してBP_PickupCubeのBP_Bullet生成用のイベントが呼ばれるようにする
まず、VR空間上の手を管理するBP_MotionControllerを開き、新規のイベントノード(Grip)を追加する
次に、エディタ左下にある変数カテゴリ内のAttachedActorをドラッグ&ドロップでイベントグラフに配置する。また、ノード配置メニューから「Cast To BP_PickupCube」ノードを配置し、Attached Actorノードと繋げる。そして、「As BP Pickup Cube」ピンからドラッグ&ドロップで表示したノード配置メニューからGrip Actionノードを配置する
-
最後に、カメラと入力を管理するBP_ MotionControllerSpawnを開き、入力イベントの追加とそれに紐づく処理を実装する
-
入力イベントは新規イベントではなく、すでに用意されている「MotionController(R/L)Grip1」を使用する。これでBP_PickupCubeを掴んだ状態でハンドコントローラのトリガーを入力すると、BP_Bulletが生成されるようになる
他のプロジェクトのアセットを取り込む
まず、ランチャーからダウンロードしたサンプルプロジェクトを開き、取り込みたいアセットを選択する。そして、右クリックメニューを開き、その中の「アセットアクション」にある「移行」を選択する【画像上】 。次に、この操作で追加されるアセットの一覧を確認した後に「OK」を押す【画像下左】 。最後に、取り込み先のプロジェクト内のContentフォルダを指定し「OK」を選択する【画像下右】 。Contentフォルダ以外を指定した場合、警告ダイアログが表示されるので注意しよう