Frest (WIP)

忘れ去られた世界を解き明かせ。己の力を発見し、その運命を決定せよ。ライリーは裏庭で謎のポータルに偶然出会い、崩壊の淵に立つ神秘の世界、ネコジマへと転移する。

期間: 24/8月 - Currently in Alpha
チーム: 13人
役割: ゲームプレイプログラマー
ジャンル: 3Dプラットフォーマー コレクタソン
長さ: 10 レベル、9 つのエリア、6 つの独自のメカニズム、複数の収集品、伝承コーデックスを備えた 30 〜 45 分の体験。
Download Link

責任


  • 様々なインタラクションメカニクス

  • レベルシーケンス

  • 最適化とデバッグ

インタラクション

Frestでの私の仕事は、進行状況のトラッキング、ワールドメカニクス、そしてシーケンサーを使ったゲームプレイ空間のつなぎ合わせでした。

私の仕事は常に、あらゆるインタラクションの可能性について質問し、システムの概略を描くことから始まります。エンジンへの実装を始める前に、デザイナーにシステムが彼らの意図通りに動作するか確認します。実装時には、メカニクスの感触を微調整できるよう、ハードコードされた変数を避けるようにしています。動作確認とプレイアブル化が完了したら、デザイナーとプレイテストを行い、改善が必要な箇所を確認します。その情報を基に、必要なモデル、SFX、VFXをすべて実装し、デザイナーと再テストを行って修正を加えます。合意に達するまで、この作業を繰り返します。

プッシュブロック


プッシュブロックには、物理​​法則とシーケンサーの2つの方法がありました。当初は、プレイヤーを常に制御するために物理法則を用いることが決定されました。しかし、最初の修正ラウンドの後、このシステムを洗練させるのが難しすぎることに気づきました。バグがランダムかつ繰り返し発生するように見え、物理法則の値を微調整して思い通りに動作させるのが困難でした。

修正ラウンドの後、シーケンサーを使用することにしました。これは、スケッチされたシステムと計画されたすべてのイテレーションを参照する際に、ブロックは前進と後退のみを行う必要があるため、シーケンスを使用するように変更したためです。

プッシュブロックは、プレイヤーが前進しているか後退しているかを確認し、適切なシーケンサーを実行します。配列のどちらかの端にある場合は、単にキャンセルされます。プレイヤーキャラクターの前進ベクトルとキューブの事前に決定された前進ベクトルのドット積を使用して、前進するか後退するかを決定します。

グーポッド


プッシュブロックとは異なり、グーポッドの製造工程は主に改良とバグテストに重点を置いていました。

プレイヤーはグーポッドを使用することで、通常の壁を登ることができます。ポッドは原料となる植物から採取され、投げられた後、衝撃で爆発します。爆発後には明るく粘着性のある物質が残ります。

グープラントは、インタラクトするとポッドを生成し、プレイヤーの手に装着してインタラクトを無効にします。このポッドはプラントへの参照を持っており、プラントをリロードするために使用します。投げられると衝突判定がアクティブになり、衝撃で複数の範囲効果を生成します。これらの範囲(ゲーム内ではグーデカールで確認できます)内では、プレイヤーは壁を登ったり移動したりできます。10秒間何もインタラクトしないと、これらの範囲は消滅します。

時間スロー


このゲームは物理ベースではないため、時間スローはメカニクスごとに実装する必要がありました。時間スローの影響を受けるものには、アイスプッシュブロック、落下プラットフォーム、そしていくつかのシーケンスが含まれます。

時間スローはGoo Podと同様の設定で、インタラクト可能なソースピックアップがあり、スポーンされたアイテムを使用するとリロードされます。

砂時計は、インターフェース実装によって示される、スローダウン可能なオブジェクトを探します。このインターフェースはpingされ、スローダウンのサイズと長さを返します。これは、VFXのサイズと時間スローの持続時間に影響します。

呼び出されたクラスは、時間切れになるかプレイヤーが死亡するまで、タイマー、シーケンサー、または更新ごとの関数をスローダウンさせます。

リセットマネージャー


プレイヤーがリスポーンした後、他のものがリスポーンするのを待って動けなくなるため、シーケンサーをリセットし、ピックアップをソースし、タイムスロー VFX などのスポーンされたゲームプレイ オブジェクトを削除するマネージャーを実装しました。

シーケンス

シーケンスは、ゲームを単なる強調点のないレベルの羅列から繋ぎ合わせるための主要な手段でした。プレイヤーの入力に関わらず、主人公が世界に影響を与える様子を見せることで、ゲームに新たなレベルの洗練をもたらすことができました。

シーケンサーの方向性については自由に決められましたが、各シーケンスには基本的な説明が与えられました。この説明に基づいて、プレイヤーが目にするもの、そして情報をどのように処理するかをより深く考え、その情報を伝えるためのシーケンスを作成しました。

使用したシーケンサーは、プラットフォーム、再利用性、そしてシネマティックの3種類です。

プラットフォーミング


デザイナーたちは、時間を遅くするというアイデアを思いついた時、独創的な発想をしました。私たちが考える最良の方法は、シーケンスを繰り返し使用することで、プレイヤーが時間を遅くした後に認識し、移動できるパターンを確立することでした。

このタイプのシーケンサーは、ワールド3でスローダウンのメカニズムと併用するために頻繁に使用されています。このシーケンサーはループすることで、プレイヤーにセクションのリズムを教え、いつアクティベートすればよいかを教えるためのものです。

再利用性


このタイプのシーケンサーは主にボスレベルで使用されました。このレベルでは、ベンのレーザービームを受けた多数のアクターが下方向に移動する必要がありました。

レベルのレイアウトは変更される可能性があるため、アクターを空のレイアウトの下にペアレント化し、シーケンサーをZ位置と回転チャンネルのみを使用するように削減しました。こうすることで、アクターの向きに関係なく、同じ動きをするようにしました。

映画ようにシーケンス


サイドエリアに入る際には、各レベルごとにシーケンサーを使い、プレイヤーが人里離れた道を移動する様子を表現することにしました。これにより、ダイナミックバインディングとシーケンスごとのスポーンの使い方が分かり、実装においてはプロキシプレイヤーを使って動きとアニメーションを指示し、その後、実際のプレイヤーをレベル内で使用できるようになりました。

最終ボス用のもう一つのシネマティックも同様の仕組みで、プレイヤーのポーンを参照として取得し、そのアニメーションと動きを操作することで、プレイヤーモデルが重ならないようにしています。

最適化

プロジェクトの終盤に差し掛かるにつれ、ローエンドハードウェアにおける主要なパフォーマンス目標と、より高性能なハードウェアにおける安定性目標を達成する必要がありました。展示された作品を通して、トレースを用いて問題を正確に特定することや、芸術的な目標に合わせてエンジンを調整する方法について多くのことを学びました。

パフォーマンス


ゲームのローポリゴン美学を考慮し、まずUnreal Engineの拡張機能を削ることを考えました。

そこからベンチマークを実施し、以下のハードウェアをターゲットに設定しました。

最小:RAM 4GB、VRAM 4GB、汎用統合グラフィックス(1080p@60fps Low)

推奨:RAM 4GB、VRAM 8GB、RTX 3050(1440p@120fps Ultra)

パフォーマンスを徹底的に改善するために、Unreal Insightsを使用して、コスト削減のために再設計が必要な主要な機能を特定しました。まず、それがエンジンの機能なのかスクリプトなのかを特定しました。エンジンの機能であれば、美学と目標に合わせて無効化または編集しました。スクリプトであれば、Event Tickから削除し、カスタムループを使用してコストのかかる部分を代替しました。

続いて、仮想シャドウマップを通常のシャドウマップとベイクに置き換え、Naniteをオフにし、ランタイムレイトレーシングを無効にしました。コード面では、コードをリファクタリングすることで約 10% 高速化できました。

設定


Unreal Engine の設定とスケーラビリティのシステムはひどいので、独自のシステムを作りました。初期ロード時に、プレイヤーが選択した設定を読み取り、デフォルトは「高」です。

設定レベルを使用して、データテーブルから変数を読み取り、複数のコンソールコマンドを呼び出して、エンジンの設定を微調整した設定に設定します。

個人的な反省


Frestは、私がUnreal Engineで制作した最初の大きなプロジェクトでした。エンジンの使い方だけでなく、プログラミングとUnityの知識をブループリントとUnrealにどう応用するかも学びました。

これまで学んだことを実際に試し、馴染みのない全く異なるプログラミングシステムでそれらのテクニックを使うことで、どれほど柔軟性があるかを確認することができました。

また、アーティストと協力してマテリアルやVFXを制作したり、デザイナーと協力してシーケンサーやレベルツールを作ったり、プロデューサーやクリエイティブディレクターと協力して適切なチーム構成について学んだりすることで、知識の幅を広げる素晴らしい機会にもなりました。