PavilionDV7の雑多なやつ

Qiitaから移行しました。UE4に関する記事から興味のあることまで色々書きます。

【UE5】アンリアルクエスト3 振り返り 5日目 ~ おまけ

はじめに

最後のパート。1日目 ~ 2日目の記事でマケプレアセットを除いたプロジェクトデータをダウンロード出来るぞ。

1日目 ~ 2日目
3日目 ~ 4日目

5日目 ブラッシュアップ

初級 1ステージに複数のBGMを入れよう

初めてSound Cueの「Crossfade by Param」というノードを使ってBGMの切り替えを実装してみた。Crossfade by Paramノードではブループリントからパラメータを与えることで予めセットしてある2つのサウンドを交互にフェードさせることが出来る。

サウンド キュー リファレンス | Unreal Engine ドキュメント

プロジェクトではSound Cueで次のような実装になっている。

Crossfade by Paramノードの使い方がバチッと分かるようなページが見つけられなかったので、Fade In/Out Start/EndについてはForumに載っていた使用例の値をそのまま拝借した。何も理解せずパラメータを設定したことでブループリント側では妙な実装になっている。

Begin Playでは使用するSound CueをAudio Componentにセットし、再生をする。この時、Set Float Parameterノードを介して「Music」というパラメータに「0.3」という奇妙な値をセットしている。これはSound Cue側のCrossfade by Paramノードで1曲目のサウンドのフェードインが完了するパラメータを「0.3」に設定しているから。1曲目はフェードイン無しで再生してほしいため、パラメータMusicの初期値として0.3を渡しておく必要があった。


改めて見ると、設定するパラメータの値は次のようにしたほうが綺麗。

1曲目のFade In StartとFade In Endの値を0.0にすることで初期値を設定せずとも曲が正しい音量で再生される。パラメータに0.4以降の数値が与えられると1曲目は徐々に音量が下がっていく。0.6が渡された時、1曲目は完全に無音になる。それと同時に2曲目も0.4から音量が徐々に上がっていき、0.6が渡されると正しい音量で再生される。2曲目のFade Out Start/Endが2.0という値になっているが、与えられるパラメータは最大で1.0を想定しているので、このような大きな値にすることで2曲目が無音になってしまう事を防ぐ。

与えられたパラメータとそれぞれの曲の音量は次のようなグラフになる。横軸がパラメータ、縦軸が音量を表す。

中級 ライティングとポストプロセスを調整しよう

レベルを構成する各種床は青、赤、オレンジと色が付いているが、これはポストプロセスマテリアルによって色付けをしている。ポストプロセスの有り無しでこのように変化する。

実装には次のチュートリアル動画を参考にした。「UnrealQuest3/Materials/PPM_MultiColordOutlines」が該当するマテリアル。

youtu.be

動画からの変更点として面に対する不透明度を設定出来るようにしている。「トロン」のようなエッジにエミッシブがかかったデジタルチックな見た目にしたかったので、狙い通りのマテリアルを作成出来るチュートリアルを見つけられたことは非常に幸運だった。

動画での実装方法はカスタムデプスステンシルを使っているので、各オブジェクトに設定されたステンシル値毎に異なる色を適用出来る。この仕様のお陰で、床の属性(静的な床・壁、ダメージを食らう床、動く床等)を可視化することが出来たので、ゲーム内容をより素早く把握出来るようになった。

ポストプロセス マテリアル | Unreal Engine ドキュメント

おまけ

定数の取り扱い

プロジェクトでは以下の画像のような「特定のオブジェクト」を判別するための手段としてActor Has Tagノードを利用している。

このとき指定するタグ名はBlueprint Macro Libraryである「BPML_Constatns」で定義している。例えば「壁蹴り可能な壁」を指すタグ名は以下のように定義されている。

この「定数をマクロで定義する」方法はSEGA TECH Blogにて紹介されている。

20年オヤジのUnreal Engine 4 TIPS - SEGA TECH Blog


定数が定義できると次のような事態を大きく減らしたり、起こってしまった場合の修正作業の手間が軽減される。

どのような規模のゲームであっても画像のようなミスは誰でもどこでも発生し得る(自分はよくやる )。少し手間だがやっておく価値はある。

レベル遷移エフェクト

レベル遷移時のエフェクトはマテリアルで実装されている。FF8のバトル遷移エフェクトを目指して、Youtubeにあるチュートリアルをベースに実装したのだが、チュートリアルへのURLを失念してしまった。

少しごちゃごちゃしているが次のグループを2つ組み合わせているだけ。

プロジェクトをダウンロードしている方はLerpノードでPreviewing Nodを有効にし、Progressの値をいじると動作を理解しやすい。

ifノードの動作については公式ドキュメントやQiitaが参考になる。

Math 表現式 | Unreal Engine ドキュメント 【UE4】マテリアルノードのifについて - Qiita

今思えば、結局ベタ塗りの矩形を動かすだけなので、マテリアルじゃなくてウィジェットで作成できるアニメーションで実装したほうが簡単だった。

理想としていたFF8のバトル遷移のエフェクトはこんな感じ。 youtu.be

おわりに

エスト1つ1つの実装難易度はそれほど高くないにしても、エフェクトを追加したり、今後を見据えて丁寧な実装をしたりしているとあっという間に時間が足りなくなる。その結果、遠回りな実装、複数箇所で同じような実装をしてしまった。

もう少しゆとりを持って取り組むとイカす実装が出来と思うのだが、実際とてもむずかしい。色々チャレンジしたくなるし。

アンリアルクエストはUE歴にかかわらず、新しい機能に挑戦したり、自分のカラーを出してみたり、色々チャレンジ出来る良いイベントなので今後も続けて欲しいなと思う。