PavilionDV7の雑多なやつ

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

【UE5】アンリアルクエスト3 振り返り 3日目 ~ 4日目

はじめに

3日目 ~ 4日目までの内容を書いていく。1日目 ~ 2日目の記事でマケプレアセットを除いたプロジェクトデータをダウンロード出来るぞ。

1日目 ~ 2日目
5日目 ~ おまけ

3日目 ギミック

初級 当たると死ぬ炎

炎パーティクルはレベルに直置きし、それに被せるように「Pain Causing Volume」を配置している。

Pain Causing Volumeはダメージを与えるためだけのアクター。ダメージ量だけではなく、毎秒単位で与えられるダメージ量、オーバーラップ時に追加でダメージを与えるかといったパラメータがある。即死エリアや、マグマ、毒沼といった継続ダメージを受けるような箇所では活躍する。

Pain-Causing ボリュームのリファレンス | Unreal Engine ドキュメント

初めは3回食らうと死んでしまうダメージ量だった。4日目の上級「チェックポイント・リスタート」が発表されたので問答無用で即死するようなダメージ量にした。難易度は上がってしまうが、即死ギミックがあるエリアの前には必ずチェックポイントを配置し、すぐさまリトライ出来るようにしたので、それほどストレスは感じないと考えた。

この判断で良かった点は、即死にしたことでダメージのフィードバックや残体力の表現等を考える必要が無くなったので、他の要素のブラッシュアップやビジュアル面で色々実験出来る時間と余裕が出来たことである。


同様の機能を持つアクターを作るのが面倒に感じたため、ダメージを与えるボリュームとパーティクルをレベルに直置きすることにした。1箇所出来てしまえば後はコピペするだけで完了すると考えていたのだが、炎エリアは場所ごとに長さが異なるのでコピペ後にパーティクルを削除したり、でも削除するとスカスカになってしまうので、更に間隔を調整したり...という微調整が発生してしまった。

土台作りをサボったために後の工程で余計に時間を取られてしまう典型的な失敗。炎エリアはゲーム全体でも4箇所しかなかったのでそれほどダメージは無いが、あと数箇所追加するとなると大きくやる気が削がれていたと思う。

ダメージを与えるボリュームを持つアクターを作成し、Construction ScriptでNiagara ActorをAdd Child Actor Componentで子アクターとして生成する感じにすると、もっと素早く、楽にレベルデザインが出来たかもしれない。

中級 動く床

動く床は「BP_Floating_Floor」に実装されている。中身を開くとコメントにある通りBP_SineMove_Componentと実装はほとんど同じ。

「どうしてこんなことになってしまったのか」というと理由はとても単純で「BP_SineMove_Componentの存在をすっかり忘れていた」から。「BP_SineMove_Componentが使い回せるような実装になっていなかった」とかいうレベルではないおっちょこちょいっぷりである。

上級 玉が飛び出てくる砲台

一定間隔で砲弾を発射するためにTick Intervalを利用することにした。

TickイベントはTick Intervalを設定することで任意の間隔でTickイベントを呼び出すことが出来る。毎フレーム処理する必要が無いポーリング処理などは、これを設定すると余計な処理負荷を削減出来る。

「一定間隔で処理する」ためのもう一つの方法として「Set Timer by Event」を使う方法もある。(パラメータのLoopingにチェックを入れること)

こちらはTickと異なり任意の場所でTimeに指定した間隔でイベントを繰り返し実行することが出来る。

タイマーを使用する | Unreal Engine ドキュメント

UE4 一定時間ごとのタイマー処理を行う(Set Timer by Event、Clear and Invalidate Timer by Handle) 凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ

4日目 ステージ

初級 ステージ変更

スーパーマリオブラザーズのワールド1-1がクリア出来る腕前があれば容易にクリア出来るように設計した。特にステージ1は死亡ポイントを配置せず、一通りの移動用ギミックを登場させて、それぞれがどのような結果になるかが体験出来るように配置した。ステージ2以降からは死亡ポイントが配置されるが、死亡ポイントの直前には必ずチェックポイントを配置してリトライし易い環境にしたつもり。

全体を通して背景には「ここは2段ジャンプするのだ」「壁蹴りするのだ」的なメッセージを込めて矢印のオブジェクトを配置してみた。本当は2段ジャンプを表す何らかのアイコンや「Space x 2」みたいな文字を出したほうが分かりやすいが、アイコンを用意するのがどれほど時間が掛かるかわからないし、文字を出すのはゲームの雰囲気に合わないと感じたのでこのようになった。

遠景の空はレベルに配置されたSkySphereBlueprintのZenith Color、Horizon Color、Overall Colorの各色を調整して設定している。これらの色を変更するには「Directional Light Actor」を「None」にし、「Colors Determined By Sun Position」のチェックを外す必要がある。

3つの項目の色をいじることで最も自由に空の色を設定出来るが、簡単に朝、昼、夕、夜としたい場合は「Colors Determined By Sun Position」にチェックを入れて「Sun Height」の数値を-1.0~1.0の範囲で変更すればOK。

UE5で新しくレベルを作成する際に選択できる「Basic」ではBP_SkySphereが無いが、Directional Lightを直接Y軸を回転させれば同様の効果が得られる。

中級 ステージを3つ以上作ろう

たまたま目に入ったカラーピッカーから「あ、RGBで3ステージ作れるじゃん」という発想に至った。ステージ1はRで赤色といった具合でステージごとのカラーに合わせて、背景の賑やかしオブジェクトの色や地面の格子マテリアルのカラーを統一させた。ステージを構成するオブジェクトがほぼキューブだけだったとこともあり、「サイバー感」「デジタル感」が強く出た統一感のあるテイストにすることが出来た。結構お気に入り。


レベル遷移はステージ最奥にあるBP_Breakable_Actorを破壊することでBlueprint Interfaceを通じてGame Modeに通知される。

レベル遷移の実装は以下の通り(「BP_UnrealQuest3_Mode」にある)。

今回のようなステージ1 -> ステージ2 -> ステージ3のような順番に1方向にステージが遷移するゲームの場合、レベルの命名規則を決めておくとレベル遷移処理は簡単な文字列操作で実装することが出来る。プロジェクトでは各レベルは「SideScrollerExampleMap_0」をタイトルレベルとして「SideScrollerExampleMap_1」「SideScrollerExampleMap_2」...「SideScrollerExampleMap_4」とレベル名を命名している。次のレベルに遷移するには末尾の数字をインクリメントすればOK。


個人的にゲームのレベル遷移やリスポーンなど「ゲーム進行に関わる要素」はGame Modeに集約するようにしている、レベルに配置されているアクターは直接キャストをして通知したり、インターフェースを通じて通知する。これによってGame Mode側で必要な処理がトリガーされるイメージ。

このへんの「どのクラスがどの役割か」については以下のドキュメントが非常に参考になる。

ゲームプレイ フレームワーク | Unreal Engine ドキュメント Game Mode と Game State | Unreal Engine ドキュメント

上級 チェックポイント・リスタートを作ろう

チェックポイントの機能は「BP_RespawnPoint」に実装している。

内容はとても単純。コリジョンにプレイヤーが衝突したら、Blueprint Interfaceを通してGame Modeに次回以降のリスポーン位置を通知している。

リスタート機能はGame Modeに実装している。実はリスタート機能そのものは下の画像の「Restart Player at Transform」のみで完結している。

注意点として、Restart Playerは生成されたプレイヤーポーンにアタッチされるPlayer Controller Objectを必要とする。Restart Playerに渡す前にPlayer Controller Objectを変数に保存せず、プレイヤーをDestroy Actorしてしまうと、参照エラーを吐いてしまうので画像のようにDestroy Actorの前に変数にPlayer Controller Objectを保存し、変数からRestart Playerに渡す必要がある。

このプレイヤーリスポーンの流れはUE4のドキュメントで解説されている。

プレイヤー キャラクターをリスポーンする | Unreal Engine ドキュメント

おわりに

次回は5日目(最終日)とおまけの内容を書く予定。 書きました。 【UE5】アンリアルクエスト3 振り返り 5日目 ~ おまけ - PavilionDV7の雑多なやつ