UE4でポストプロセスとシーケンサーによる敵エンカウント演出

2019年3月3日

シンボルエンカウントを実現するため、敵とぶつかった時のバトルシーンへの遷移演出をポストプロセスのモザイクとシーケンサーによるコントロールで実装してみました。

 

※画像はクリックで拡大できます

 

スポンサーリンク

ポストプロセスで使うモザイクのマテリアルを用意する

 

ポストプロセスが何たるかに関しては、偉大なる方々が丁寧に解説されておりますので、ここでは簡単な説明を・・・・。

描画バッファーに格納されている描画結果に対して、様々なエフェクトをかけるという認識かと思っております。

描画バッファーというと昔、DirectXやらOpenGLなどでゲームを作ろうと思って最初の方に実装するのが、フロントバッファとバックバッファのフリップ処理だったりしたような気がします。

UE4ではポストプロセスボリュームで比較的簡単にポストプロセスが実現できるので、それに適用するポストプロセス用のモザイクマテリアルを用意します。

コンテンツプラウザ上で右クリックして、「マテリアル・テクスチャ」からマテリアルを選択して作成します。名前は「EncountMat」にしました。EncountMatの内容は下記画像の通りです。

モザイクのマテリアルBP

 

EncountMat中にあるMF_GetOffsetPixelはマテリアル関数です。コンテンツプラウザ上で右クリックして、「マテリアル・テクスチャ」からマテリアル関数を選択して作成します。名前は「MF_GetOffsetPixel」です。MF_GetOffsetPixelの内容は下記画像の通りです。

MF_GetOffsetPixelのBP

 

さらに、EncountMat中に「MozaikSize」というパラメーターがありますが、これは「マテリアルパラメータコレクション」といい、モザイクのかかり具合を調整するパラメーターとして用意したもので、後でシーケンサー上で値を変更するのに使います。

コンテンツプラウザ上で右クリックして、「マテリアル・テクスチャ」からマテリアルパラメータコレクションを選択し作成します。名前は「MyMatParam」にしました。

MyMatParamの内容は下記画像の通りです。

MyMatParamの詳細

 

スカラー値のMozaicSizeを追加してあります。これをEncountMatで呼び出して使用します。

EncountMatのブループリントで、右クリック→検索欄に「CollectionParameter」と入力して作成します。作成したら詳細のCollectionに先ほど作成したMyMatParamを指定して、Parameter NameはMozaicSizeにしました。

EncountMat内のパラメーター、MozaicSizeの詳細

 

次はこのEncountMatをポストプロセスボリュームにセットします。

 

ポストプロセスボリュームの配置と設定

 

ボリューム→ポストプロセスボリュームと選択してレベル上に配置します。配置する場所はとりあえずカメラにかぶらなければ何処でも良く、かぶっても多分平気かと思います。

 

配置したポストプロセスボリュームの詳細に、「Post Process Materials」という項目があるので、そこに先程作成したEncount Matをセットします。

ポストプロセスボリュームへのマテリアル設定

 

マテリアルをセットした項目の下に、「Post Process Volume Settings」という設定項目があります。その中の「Infinite Extent (Unbound)」にチェックを入れる事で、ポストプロセスボリュームが何処に配置されていても、効果がかかるようになります。

ポストプロセスの効果がワールド全体に及ぶように設定

 

この時点でMyMatParamのパラメーター、MozaicSizeのDefault Valueを10.0くらいにしてみると、ワールド全体にモザイク効果が掛かる事が確認できます。

ワールド全体にモザイクがかかるようになった。

 

しかしこのままだと常にモザイクが掛かった状態になってしまうので、Post Process Volume Settingsの「Blend Weight」の値を0.0にしておきます。

後は、シーケンサーでMozaicSizeを変える事でモザイクフェード演出を行っていきます。

 

シーケンサーの作成と配置

 

シーケンサーを使う事で、キーフレームによるアクター、カメラの移動やアニメーションの好きなタイミングでエフェクトを出したり、カスタムイベントを併用する事で特定のタイミングで好きな制御を実行できたりと超便利です。きっと色んな事ができます。

コンテンツプラウザ上で右クリックして、「アニメーション→Level Sequence」と選択してシーケンサーを作成します。名前はEncountSeqにしました。

後でカスタムイベントをシーケンサーで呼ぶ都合上、作成したEncountSeqをレベル上に配置しました。配置する場所は何処でもOKです。

作成したEncountSeqを、下記画像の通り編集します。

シーケンサーの作成

 

緑色の「+ Track」ボタンで各項目を追加できます。また、右側のフレーム数が書いてある所で右クリックすると、「開始時間を設定」と「終了時間を設定」ができるので、0~30フレームに指定しました。各項目の説明です。

●PostProcessVolume3

先程作成したポストプロセスボリュームになります。(3は気にしないで下さい・・・・)

項目名の「+」をクリックして「Blend Weight」を追加しました。開始と終わりにキーを打ち、キーを右クリックしてPropertiesを表示し、Interp Modeを「None」にする事で1.0~0.0の値を補間する事なく切り替えるようにしています。

これでシーケンサーが再生された時だけ、再生が終了したらモザイクが掛からないようになります。

●MyMatParam

先程作成したマテリアルパラメーターコレクションになります。

項目名の「+」をクリックして、MozaicSizeを追加しました。開始と終わりにキーフレームを打ち、0.0~20.0までの値で遷移します。これで徐々にモザイクが掛かって行く演出になります。

マテリアルのパラメーターは、このようにマテリアルパラメーターコレクションに定義する事でシーケンサーで制御できるようになるようです。

●フェード

オーソドックスな黒フェードです。20f~終了までで値を0.0~1.0になるようにキーフレームを打ち、黒フェードアウトするようにしています。

 

シーケンサーからカスタムイベントを呼び出す

 

敵のエンカウント演出なので敵に接触したらシーケンサーを再生し、モザイクフェードが終了したタイミングでバトルシーンへの遷移を行いたい訳ですが、シーケンサーの再生終了を検出するためにフレームの最後にカスタムイベントを仕込んで行きます。

コンテンツプラウザ上で右クリックして、ブループリントクラスを作成します。親はActorを指定します。名前を「SequenceEvent」にしました。

SequenceEventの内容は下記画像の通りです。

SequenceEventのBP
SequenceEventで使ってるLoadOpenLevelのBP(ブループリントマクロライブラリ)

 

シーン切り替えのカスタムイベントとして「BattleSeqEnd」を作成しました。

シーン切り替えのカスタムイベントが作成できたら、このブループリントクラスもレベル上に配置します。これまた場所はどこでもOKです。

シーケンサーの最後にこのカスタムイベントを呼び出すよう設定していきます。

先程レベル上に配置したシーケンサー「EncountSeq」を選択し、詳細の「一般」という所を見ると「Additional Event Receivers」という項目があります。

このAdditional Event Receiversに作成したブループリントクラス、SequenceEventを登録します。

レベル上に配置したシーケンサーにカスタムイベントを作成したBP登録

 

シーケンサーを開いて緑色のボタン「+ Track」を押して「イベントトラック」と、Actor To Sequencerから先程作成したカスタムイベントのBP、SequenceEventを追加します。

シーケンサーにイベントトラックとカスタムイベント用BPを追加

 

イベントトラックを右クリックしプロパティを開くと、「Event Receivers」という設定項目があります。そこにもカスタムイベントのBPであるSequenceEventを追加します。

イベントトラックのプロパティ、Event Receiversに追加

 

後は終了のフレームにイベントトラックのキーを打ち、キーを右クリックしてプロパティを開き、EventNameの所にSequenceEventのBPに書いたBattleSeqEndを指定すれば、シーケンサーを再生すればモザイクフェードが終了した時にシーン遷移するようになります。

イベントトラックのキーのプロパティ、EventNameにBattleSeqEndを指定

 

モザイクフェードのシーケンサーを再生する

 

シーケンサーの作成が完了したので、敵とぶつかった時にシーケンサーを再生します。シーケンサーの再生が完了した時に、カスタムイベントのBattleSeqEndが呼ばれ、レベルの非同期読み込みとオープンが行われレベル遷移するという流れです。

最後にシーケンサーを再生するブループリント、SequencePlayが下記画像になります。

シーケンサーを再生するBP(ブループリントマクロライブラリ)

 

インプットのLevel Sequenceは作成したシーケンサーを指定します。SetPlaybackPositionに関しては、NewPlaybackPositionを0.0にして呼び出さないと、シーケンサーのフレームが0.0の最初から開始されないらしいので、明示的に開始フレームを指定しています。

このSequencePlayを任意のタイミング、自分の場合は敵とぶつかった時に呼び出す事でポストプロセスとシーケンサーによるエンカウント演出を実現しています。

スポンサーリンク