サードパーソンゲームで使う動的カメラに必要な 6 つの要素
April 27, 2018

サードパーソンゲームで使う動的カメラに必要な 6 つの要素

作成 Nick Pruehs

『Deponia』 『The Pillars of the Earth』 などのアドベンチャーゲームで 10 年以上非常に高い評価を受け続けている Daedalic Entertainment です。私達はその他のジャンルもかなり長い間研究しています。今回はサードパーソン アドベンチャー 『State of Mind』およびその他のサードパーソン アクション アドベンチャーのプロトタイプについてご紹介します。

これらのゲームを作成するために私達は迷うことなくアンリアル エンジン 4 を選びました。なぜならアンリアル エンジンはプログラマー、アーティスト、ゲームデザイナをはじめチーム全体が最高品質の製品を生み出す力を与えてくれるからです。

ではこれからサードパーソン アクション アドベンチャーで用いる動的カメラについて説明します。目標は、プレイヤーの意図を決して妨げることなく、極めて重要な探索エリアを強調し CQC を容易にするカメラの設計です。プレイヤーにカメラの動きが良くないと認識されると怒りやイライラに直結するので、プレイヤーの意図を妨げないことはとても重要です。

アンリアル エンジン 4 は任意のカメラ モディファイアを定義するために非常にフレキシブルなビルトイン システムを提供しています。ビューに対して相対的な移動と回転を適用してもしなくてもよいのです。そのため、異なるゲームプレイ エレメントがお互いに邪魔することなくカメラの変更ができます。

このカメラモデルを進化させて以下を可能にしました。

  • プレイヤーがレベルの特定のエリアに移動中にカメラを修正する
  • 現在のピッチ アングルに合わせてカメラの距離と FOV を自動変更する
  • プレイヤーによって選択されたターゲットにフォーカスする
  • プレイヤー キャラクターを現在の移動方向で回転させる
  • 戦闘中にカメラのプロパティを変更する
  • カメラとプレイヤー キャラクターの間の視界がレベル内の障害物に絶対に遮蔽されないようにする
  • プレイヤーがプレイヤー入力で常に動的カメラをオーバーライドできる

我々の動的カメラは以下のプロパティの変更が可能です。

  • FOV (視野角)
  • カメラの距離
  • DOF (被写界深度)
  • カメラ アングル
  • 相対的なカメラ位置

FOV や DOF などはエンジンにビルトインされている FPostProcessSettings などで変更可能なプロパティですが、動的カメラ距離などは私達が新たに追加したプロパティです。

これらのすべての要件は John Nesky 氏による有名な講演 「50 Camera Mistakes in Journey」 (このトピックの関係者必見) に基づいています。

カメラ システム アーキテクチャ

各フレームのプレイヤー ビューの最終ポイントはアンリアルの カメラ関連機能のチェーン で決定します。プレイヤー カメラ マネージャーだけでなくカメラ、プライヤー コントローラーがすべて連携してゲームにおいて絶えずカメラ位置とアングルを見つけています。プレイヤー カメラ マネージャーを使うと、カメラ モディファイアがビューの最終ポイントの登録と修正を行うことができます。

すべてのカメラ モディファイアの基本クラスである UHoatCameraModifier はビルトイン UCameraModifier を拡張します。UHoatCameraModifier は、各プレイヤー入力後のクールダウン期間、プレイヤーの意図を常に優先するために動的カメラ挙動の無効化、カメラ距離の変更や DOF の変更などのカメラ エフェクトへの滑らかな切替を共通機能として提供しています。

すべての特定のモディファイアは UHoatCameraModifier を拡張し、そのモディファイアのほとんどは FHoatCameraInfo というカスタムの構造体を参照します。この構造体はカメラ距離の視野角といったひとつのモディファイアで変更可能なすべてのプロパティを格納しています。また、カメラ挙動を指定するためにすべてのブループリントに共通のインターフェースを提供しています。

カメラのスプリング アーム

カメラ モディファイアを使えばキャラクターとカメラ間の距離の変更が可能です。しかしながらその場合は USpringArmComponent は両方の見通しが障害物に遮蔽されない限りカメラからプレイヤー キャラクターまで特定の距離を確保するエンジンにビルトインされている USpringArmComponent の利点を生かせなくなります。その場合、スプリング アームは視界を保つために自動的にカメラをキャラクターの近くに引き寄せます。

デフォルトのカメラ距離は USpringArmComponent の Socket Offset で変更することができます。チーム全体でカメラ距離の設定を必ずこのソケットのみで行うようにすると、全員の作業がしやすくなります。例えば Z 軸方向のカメラ空間トランスフォームを誰でも変更できたとすると、ゲームでの最終カメラ位置を引き出した計算を理解するのが難しくなってしまいます。

私達はスプリング アーム機能を使いたかったので、USpringArmComponent を拡張してカスタムの UHoatCameraSpringArmComponent を作成しました。このコンポーネントにより、任意数のカメラ モディファイアがスプリング アームの長さを変更し、基本的なスプリング アーム機能を維持したまま結果をフレームごとに適用することができます。

カメラのアングル、FOV、カメラのラグ

その他の重要なデフォルトのカメラ プロパティの多くは、アンリアル エンジン 4 によって既に変更されています。カメラ コンポーネントでデフォルトの FOV を自由に指定することができます。

CameraSettings.png

プレイヤーカメラ マネージャーを使うと、カメラの最小 / 最大ピッチアングルを指定することができます。

PlayerCameraManager.png

同様にスプリング アーム コンポーネントにもカメラ ラグを有効にするオプションがあります。別名ラバーバンド カメラを作成するために、Camera Lag と Camera Rotation Lag を有効にして、それぞれの速度を指定するとこの機能を有効にすることができます。少しの間静止した後キャラクターがいずれかの方向に移動し始める時、ゲーム体験が突然すぐないようにカメラは少し間を置いてから追跡します。その結果として、プレイヤー キャラクターが移動を停止した後、少し時間を置いてから移動を停止します。

CameraLag.png

ピッチベースのカメラ モディファイア

動的カメラのその他のすべての機能はカメラ モディファイアに基づいています。つまりそれらは UHoatCameraModifier から派生したクラスで実装されます。

この最初のモディファイアは各種カメラ プロパティで現在のカメラ ピッチ アングルに合わせて変更することが可能です。通常、カメラ ピッチ アングルはプレイヤーの入力によって直接変更されます (ゲームパッドの右スティックの Y 軸を使用するなど)。私達はプレイヤーがカメラを傾けるたびに、距離およびその結果の FOV など他のカメラのプロパティも変更することにしました。自分達が常に掲げている重要な目標のひとつが最高のフレキシビリティをデザイナーに提供することなので、この UCurveFloat アセット ポインターを公開してプレイヤー カメラ ピッチ入力から派生した任意のカメラ挙動を定義できるようにしました。

Camera Modification Volumes

例えば、洞窟を出て広大なオープン空間にプレイヤーが直面した場面など、レベル デザイナーは非常に重要なレベルエリアを強調したいと思います。パズルや他のゲーム メカニクスではプレイヤーの身近な部分の概要の改善が求められる場合もあります。

いずれの場合でも、AHoatCameraModificationVolumes をレベルのどこにでも配置することができます。

これらのボリュームは遷移時間と共に FHoatCameraInfo プロパティ セットを提供しています。これらは両方ともカメラ モディファイアによって再度適用されます。

CameraModificationVolume.pngボリュームのオーバーラップはまだサポートされていませんが簡単に追加できます。

戦闘カメラ

我々のゲームは遠距離と近接の両方の戦闘が特徴です。近接の場合プレイヤーは、後方から攻撃する敵を含めて自分の身の周りをよく理解していることが必要です。同時に、水平のビューによって気を取られるのではなく、プレイヤーが近辺の敵に集中できるようにしています。

再度カメラ モディファイアを使って、プレイヤーが戦闘中はカメラ距離を伸ばして DOF を強めて FHoatCameraInfo を適用しています。

進む方向へのフォーカス

動的カメラの基本要件のひとつは、プレイヤー キャラクターの進む方向への自動フォーカスです。プレイヤーがカメラ自体を調節する必要が減れば減るほど良いです。またプレイヤーはプレイヤー キャラクターの歩行方向のフォーカスを十中八九自分で常に行っています。

この理由から、プレイヤーが静かに立っていない場合のみカメラを回転させるなどのパラメータで実験しながら、プレイヤー入力なしでフォーカスできるようにカメラ モディファイアを追加しました。プレイヤーがカメラを回転させるには、動的システムを常に優先しなければなりません。近くにある面白そうなスポットを観察するためにカメラを回転させた後、カメラが自動でゆっくり戻るのを見ると非常にイライラします。

アビリティ ターゲットへのフォーカス

私達のプレイヤー キャラクターには敵に仕掛けることができる便利なアビリティが豊富にあります。ゲームパッドの右スティックでのターゲットの選択中、ゲームはスローモーションになり、選択中のターゲットにカメラをスナップします。

TargetSelection.png

これは開発段階における初期の機能のひとつだったのでカメラ モディファイアなしで当初は実装されました。後に、ターゲット選択が動的カメラ システムを妨げることが分かったので、これに対してもてカメラ モディファイアを作成しました。

視線の維持

最後に追加したカメラ モディファイアは、カメラがキャラクターに対する視線を絶対に失わないようにします。カメラのスプリング アームのデフォルトの挙動は、カメラをキャラクターの近くへ引き寄せることですでにこの要件を満たしています。

この要件にを満たすためのもうひとつの方法は、プレイヤー キャラクターを遮蔽している可能性のあるすべての障害物の周りをカメラを揺らすことです。そのような可能性のある障害物を探知するために、カメラからキャラクターの左と右に向けてアングルを増やしながら複数のレイをシュートしています。「微々たる量の」これらのレイキャストは、「50 Camera Mistakes in Journey」で紹介されているように、すぐ後にキャラクターを遮蔽する可能性のあるすべての障害物を探知します。障害物を見つけると、カメラはキャラクターの周りをゆっくりと回転して視界を維持します。カメラの回転速度、2 つの微々たる量のレイキャスト間のステップサイズ、見るべき距離といったプロパティをデザイナーに公開します。

両方のカメラを近くに引き寄せて障害物の周りを回転させるのでは明らかに意味がありません。そこで CameraRotateAround と呼ばれる追加のコリジョン チャネルを実装しました。特定の障害物に対して反応機能を持つことができるのは、2 つのコリジョン チャンネルのどちらかです。

結論

アンリアル エンジン 4 はカメラ関連機能のチェーンよって、動的に調整可能な複雑なサードパーソン視点のカメラ挙動を作るためのソリッドで非常にフレキシブルな基盤を提供します。

カメラのスプリング アーム コンポーネントを若干変更しカメラ モディファイアをいくつか追加して、プレイヤーの意図を常に優先しながら極めて重要なレベルのエリアを強調しつつ、楽しいプレイヤー体験を確実にする動的カメラを開発することができました。

以下のコメント欄にご意見、改善要望などをお気軽にお寄せください。GitHub ですべてのソースが利用できます。ご一読ありがとうございました!