[アンリアルクエスト2]振り返り

概要

エピック ゲームズ ジャパン様主催「アンリアルクエスト2」参加の振り返りです。

各オーダーの実装紹介と反省で構成されています。

提出動画(+追補)

クエスト要素

1日目初級:好きなアセットを配置しよう

お招き致しました。

反省点:
たぶんそういう事じゃない。
ただ「グレイボックスをアセットで置き換えよう」という課題だったらこの技で埋めてた。

1日目中級:揺らめく旗を立てよう

サンプルで用意されていた旗Static Meshが頂点めっちゃ分割してあった上に旗部分とポール部分でMaterialが別れていたので、MaterialのSimpleGrassWind関数を使ってみる事にした。

SimpleGrassWindそのままだと思うように制御できなかったので、該当するMaterial FunctionアセットをProject側にコピーして内部で変位の周波数の肝になっていそうな直値をパラメータ化して調整している。

SimpleGrassWindとよくセットで見かけるBoundingBoxBased_0-1_UVWで根本は揺れないようにしたが、このMeshに対しては単にTexCoordからUV値を使っても大丈夫そう。

反省点:
簡易かつ安定する一方で揺れは若干単調。今回の「一本だけある旗」のように注目されるオブジェクトには向いてないかもしれない。Content Examplesにもっとそのまんまの旗揺らし用Materialがあるので、そっちも勉強になりそう。

1日目上級:スプラインに沿ってモノを効率よく配置しよう

前回のアンリアルクエストはサイドスクローラー風にして提出したが、実はカメラを触ってないだけのTPSテンプレートそのままの実装で、上下に入力すれば奥や手前に移動できる状態だった。いつかちゃんと作りたいな…と思っていた所にこの課題が来た。

まずSpline Componentを持つActor(以下、コースBP)を作成してレベルに配置し、Splineでプレイヤーに通らせたいコースを作る。次にアイテムActorを手動でコースの近くに配置する。そしてEditor Utility WidgetからコースBPを参照して、レベル内に配置したアイテムActorについて最寄りのSpliine上の座標に移動させた。これでコースを変更してもすぐアイテム位置を修正できるし、取得できないアイテムが発生しないように厳密にコース上に乗せるような気を使う作業から開放される。

Splineにフィットさせる処理の肝はFind Location Closest to World Locationノード。そのまま使うとSpline上に乗ってしまうので、ジャンプして取るアイテムのようにZ座標だけ維持したい場合は出力を加工する必要ある。プレイ中も同じ処理でPlayer Pawnをコース上に乗せている。

プレイヤーBPとは別にゲーム中カメラBPを作成した。TickでコースSplineから姿勢計算している。Find Tangent Closest to World Locationでプレイヤーが居る場所のSplineの進行方向がわかるので、そこから右手方向にカメラを置けばよい。

プレイヤーBPのカメラ制御系は使わないので、プレイヤーBPの移動方向決定処理に使う参照値を変更した。

ヨシ!これでスプラインに沿ってモノ(アイテム、プレイヤー、カメラ)を効率よく配置できたな!


反省点:
すみませんでした。
アイテム連続配置用のSplineを作って、そのSplineのPointをコースにフィットさせる所まで行けば言い逃れ出来たかもしれない。くっ殺。

また、ゲーム中カメラの処理でコースBPとプレイヤーBPをバリバリ直接参照しているが、そのActorへの依存が発生するので良くない。カメラは計算に必要なSplineと座標値があれば仕事できるので、他Actorについて知る必要や責任は本来ない。でも締切がめちゃ近いので持ち分を逸脱して仕事してくれている。なんと美しい姿だろう(棒読み)

あと、プレイヤーBPの改造も実はマズい。通常の真横カメラのときはあれで良いが、銃を撃つシーンのカメラになった時もカメラ基準で移動方向を決めるので、あの時だけ右上に入力しないと前に進まない。まぁバレてないバレてない。これを回避するには、単にゲーム用カメラBPの回転方向をプレイヤーBPに渡せばよいだろう。

2日目初級:ライティングを全種置こう

全体にDirectional LightとSky Light、松明でPoint Light、銃アイテムの強調にSpot Lightを使っている。コーン型の光MeshはEngine Contentに入っていたS_EV_SimpleLightBeam_03を拝借。

反省点:
Spot Lightのこじつけ感。しかも壁際でもないので、Point Lightで同じ絵になったような気もする。

2日目中級:時間を変化させよう

特にひねりもなく、新規レベル作成時に選べるTime of Dayのテンプレートそのまま。

コース上にBox Triggerが置いてあって、それを踏むとLevel BlueprintがDirectional LightのPitch角Timelineで変化させる。

反省点:
Time of Dayそのままだと夜空が真っ暗なので、星や雲など見える工夫があったほうが良かったかも。

2日目上級:ライトシャフトを作ろう

公式Docmentに従い、Directional LightのLight Shaft Bloomにチェック入れただけ。壁を壊す処理の実装についてはこの辺を参照

反省点:
破壊した壁の隙間から光が差し込んでくる表現は、実は第16回UE4ぷちコン応募作のエンディングで使う予定だった。テンポ重視でボツだったのを改めて実装した。ボツでもいつか使う機会があるかも…というのは「まず案をたくさんひねり出す」スタイルの良さかもしれない。

3日目初級:松明を作ろう

特にひねりもなく実装。

NS_TorchはNiagara。FountainテンプレートからGravityを消して、Scale Colorで赤→黒に色を変えて、Dragで減速させ、Scale Sprite Sizeで煙が大きくなるようにした。

反省点:
Curl Noiseで火の粉を飛ばすぐらいは追加でやれそう。根本的な所では、アートがフォトリアル系ならやっぱり連番テクスチャか、凝るならAlembicとか使うのが良さそう。

3日目中級:歩くと煙が立つ

おかず神の神ブログ記事をベースに発生処理を実装。

左右の足で別名のAnimNotifyにして共通処理に左右フラグとして渡した。FX用のNotifyが用意されているが、着手時点で足音を鳴らす課題もあるとわかっていたのでまとめている。

煙ParticleはFountainの改造で作成。

  • Spawn Rateを消してSpawn Burstに

  • 寿命を短く

  • 発生位置をTorusに

  • 速度調整

ジャンプの着地時にも流用した。発生タイミングは着地Animationの末尾にAnimNotifyをつけて検知している。煙Particleの個数と発生半径をパラメータ化して、多めに+広めに出るようにしている。

反省点:
「(グレイマンが回し車で)歩くと(ボイラーに風が送られて煙突から)煙が立つ」ぐらいのひねりが欲しい。
あと、左右の足で別のAnimNotifyにしなくても、ヒストリア神の神記事を参考に引数付きAnimNotifyを使う方がシンプルそう。ただ、Animation Blueprint内にNotify Eventを持ってくる方法が時間内に調べきれなかったのでパワー・オブ・ザ・ゴリラでかいけつした。

3日目上級:ゴール演出を作ろう(Niagaraを使ってみよう)

動画提出直後にこの課題をやってなかった事に気づいて悶絶。Niagaraは松明と煙で使ったからええやろと誤認していた。まぁそんな日もあるさ!でも課題だからやっておこう。とりあえずNiagaraテンプレートのOmnidirectional Burstの改造でなんとかならないかと格闘し、でもこんな普通でええんかと葛藤し、しかも20:00からの生放送までには終わらせなくてはいけないのでギリギリまで頑張って踏ん張って、どうにもこうにも、どうにもならない、そんな時、

ブルーマンがほしい。

まず、ブルーマン頭部Static Meshを用意しますご家庭に常備してあるもので結構です。

Sample Static Meshモジュール使用して頭部形状に沿ってParticleを発生させる。詳細はContent ExamplesのNiagaraマップを参照。頭部全体だと顔を視認しづらいので、顔部分だけになるように自作Niagara Module ScriptのNM_GetFrontモジュールで調整している。

NM_GetFrontの一部。X座標値で寿命を足切り。ついでに多少ランダマイズ。

NM_GetFrontの一部。発生時のX座標に応じてColorに倍率をかける事で擬似的な陰影を付与し、顔面だと認識しやすくする事を狙った(成功したとは言っていない)。

NM_GetFrontの一部。X座標を調整して顔の凹凸も強調た。ついでに花火っぽい挙動のために初期座標を少し圧縮している。あとはAdd Velocity Pointモジュールが拡大してくれる。

反省点:
課題漏れはあかん。ネタ画像なんか作ってないでちゃんと毎日参加しなさい。

座標の寿命足切り処理は、そもそも不要な位置からサンプルしないようにSample Static Meshをコピーして改造したほうが良い気がする。またエフェクト全体としては、花火の打ち上げ部分もないし、広がった後の挙動もまだまだ花火っぽくない。あと顔認識を優先する場合は立体的にして陰影をつけるより輪郭のみにするほうが良さそう。Sample Textureモジュールを使うとして、Scene CaptureでTextureを作る際にエッジ検出した上で深度値を書き込んでおけば挙動を立体的にするのにも使えるかな。

4日目初級:松明に音を付けよう

前述の松明BlueprintにAudio Componentをつけて対応したが、Starter Contentに炎ループ音素材が入ってるのを見落としていたので#GameAudioGDCから焚き火の環境音を持ってきた。

素材は素晴らしいが非ループなので、MetaSoundでループさせるというパワー・オブ・ザ・ゴリラJr.でかいけつした。パチパチ音自体はずっと鳴っているので案外気が付かない。

サイドスクローラーにした関係でカメラがプレイヤーから遠いので、プレイヤーBPのTickでAudio Listener位置をプレイヤーの近くに上書きしている。Attenuation Settingsで音の聞こえる範囲の方をでかくしても良いが、そうするとカメラの背後にある松明の音を拾ったりするので素人にはおすすめできない(一敗)。

反省点:
ひねりなさい。メラ…メラ…とか書き文字Particle出しなさい。

4日目中級:歩くと足音が鳴る
4日目上級:歩く地面によって足音を変えよう

両方とも、完全におかず神の神記事を丸パクリしたので特に言うことがない…

足音選択はSelectノードで対応したぐらいだろうか。

反省点:
ひねりなさい。MetaSoundでなんかダイナミックでプロシージャルな感じにしなさい(おおらかな指示)。

5日目初級:温かみか冷たさを感じる色味をつくろう

日の出になるTrigger Boxを踏んだ時ついでに色温度も暖かくしているのだけど、松明のPoint Lightを既に暖色系にしているのもあってぜんぜんわからない。雰囲気でポスプロをやっている。
やり方そのものは公式生放送の模範解答と同じなので、私は模範生。<Q.E.D>

反省点:
わからないように馴染ませるのが本来の姿とはいえ、もっとわかりやすくできた気はする。松明の少ない最初の方は寒い系の色にするとかかな。

5日目級:ダメージを受けた時の表現をつくろう

普段やらないレベルのChromatic Aberrationをぶち込んだ。一時的なポスプロという事で、Camera Modifierを使っている。

作成したCamera Modifier派生BPWeight変数を足して公開。

プレイヤーBPにEvent AnyDamageが実装済みだったので、そこにCamera Modifier処理を追加した。

反省点:
赤色VignetteとかLens Dirtとかもっとモリモリにしなさい。これを作った時の処理を流用して、モザイクを強くかけてから戻すみたいなのもいいかもしれない。

5日目級:物陰に隠れるとシルエットになる

「何があるか見えないまま移動するストレス」を回避した上に、連続アイテムゲットで快感まである。それがマリオ3Dワールドの恐ろしい所なんですよ…

シルエットマスク用Post Process Materialの中身。 Custom Depth等の概念自体はスーパーもんしょ神ゴッドの死海文書を参照。Stylized Renderingの公式講座も手を動かしながら学べるのでおすすめ。

反省点:

ひねりなさい。物陰に入った部分だけブルーマンになるとか微妙に手間かかる割に伝わりづらい事しなさい。

所感

本当すみませんでした。

ピックアップ生放送にて、他の参加者の方々の提出動画を見て焦りました。みんなちゃんとアートしとる。そっち方面はとりあえずオーダーを全部やってからかなと思っていたら全く時間がありませんでした(しかも1つ漏れてた)。インバスケット思考とか言ってる場合じゃないですね。俺がグレイ(ボックスまるだし)マンだ。時間内にアート込みでクリアしている方も多くおられるので、自分の未熟さを知るばかりです。良いものをたくさん見せて頂きました。参加者の皆様、お疲れさまでした。

では仮に時間があればアートがやれたかと言うと…過去に作ってきた作品も、背景はデモマップ流用だったりHDRI丸投げで誤魔化してきたので…わはは。まずは初心者向けのイベントに参加するなどして練習していきたいですね。そういえばアンリアルクエストという最適な(ごますり略)。運営の皆様も、素晴らしい機会を有難う御座います。本当にお疲れさまでした。

今後も精進致します。
宜しくお願いします。