Godotで作るFPSのカメラと視点移動

Gobot

Godotで作るFPSのカメラと視点移動

カメラと視点移動の基礎

Godot EngineでFPS(ファーストパーソン・シューター)を作成するにあたり、カメラと視点移動はゲーム体験の根幹をなす要素です。プレイヤーが世界をどのように認識し、操作するかを決定づけるため、その実装は非常に重要となります。

ノード構成

FPSのカメラシステムは、主に以下のノードで構成されます。

  • Spatialノード (ルートノード): プレイヤーキャラクター全体のコンテナとして機能します。
  • Cameraノード: プレイヤーの視点を表します。通常、Spatialノードの子ノードとして配置されます。
  • KinematicBodyノード (またはRigidBodyノード): プレイヤーキャラクターの物理的な移動を処理します。
  • CollisionShapeノード: KinematicBodyノードに衝突判定のための形状を付与します。

Cameraノードは、Spatialノードの子として配置され、Spatialノードが回転することでプレイヤーの視線方向が変更されるように設計するのが一般的です。これにより、キャラクターの機軸と視線の機軸を分離して管理できます。

視点移動の実装

視点移動は、主にマウスの動きを検出してカメラの回転に反映させることで実現します。Godotでは、_input(event)関数を使用して入力イベントを処理します。

マウスの移動イベント(InputEventMouseMotion)が発生した場合、event.relative.xで水平方向の移動量、event.relative.yで垂直方向の移動量を取得できます。これらの値を使用して、カメラノードのrotate_y(deg2rad(-event.relative.x * sensitivity))(水平方向)と、親ノード(通常はSpatialノード)のrotate_x(deg2rad(-event.relative.y * sensitivity))(垂直方向)を更新します。sensitivityはマウス感度を調整する変数です。

垂直方向の回転には制限を設けることが重要です。例えば、上を向きすぎたり、下を向きすぎたりするのを防ぐために、カメラノードのrotation_degrees.xが一定の範囲(例:-80度から80度)に収まるようにクランプ処理を行います。

プレイヤーの移動

プレイヤーの移動は、キーボード入力を受けてKinematicBodyノードを動かすことで実装します。_physics_process(delta)関数内で、WASDキーなどの入力を検出し、それに応じた方向ベクトルを計算します。

Input.get_vector("move_left", "move_right", "move_forward", "move_back")のような関数を使用すると、複数のキー入力をまとめて処理でき、移動方向ベクトルdirectionを取得できます。このdirectionspeed * deltaを乗算した値をmove_and_slide()関数に渡すことで、キャラクターを移動させます。move_and_slide()は、衝突を自動的に処理してくれる便利な関数です。

ジャンプ機能も、スペースキーなどの入力を受けて、キャラクターに上方向の速度を加えることで実装できます。is_on_floor()関数で地面にいるか判定し、地面にいる場合のみジャンプできるように制約を設けると良いでしょう。

カメラの揺れとキャラクターアニメーション

カメラの揺れ(Head Bobbing)

FPSにおいて、歩行や走行時にカメラがわずかに揺れる(Head Bobbing)ことで、臨場感が増します。これは、キャラクターの移動速度や種類に応じて、タイマーやサイン波(sin()関数)などを使用してカメラの上下または左右の微小な移動と回転をシミュレートすることで実装できます。

例えば、_physics_process(delta)内で、キャラクターが移動している場合にタイマーを進め、タイマーの値に基づいてカメラのtransform.origin.yをサイン波で上下に動かします。また、歩行に合わせてtransform.origin.zをわずかに前後に動かすことで、より自然な揺れを表現することも可能です。

キャラクターアニメーションとの連携

キャラクターの視点移動だけでなく、キャラクターモデル自体の歩行、走行、ジャンプなどのアニメーションも重要です。これらのアニメーションは、GodotのAnimationPlayerノードを使用して管理します。

プレイヤーの移動入力や状態(地面にいるか、空中かなど)に基づいて、適切なアニメーションを再生します。例えば、移動キーが押されていて地面にいる場合は歩行アニメーション、ダッシュキーが押されている場合は走行アニメーション、ジャンプキーが押された場合はジャンプアニメーションを再生します。カメラの揺れとキャラクターアニメーションを同期させることで、より一体感のあるゲーム体験が生まれます。

高度なカメラテクニック

キャラクターの向きと視点の分離

前述の通り、カメラノードをプレイヤーキャラクター(Spatialノード)の子にすることで、キャラクターの機軸と視線の機軸を分離できます。これにより、キャラクターは前方に進みながら、横を向いたり後ろを向いたりすることが可能になります。これは、キャラクターの移動方向とカメラの向いている方向が異なる状況(例:横歩き)を自然に表現するために不可欠です。

カメラのズーム機能

武器のスコープや、特定の状況下での視界の狭窄などを表現するために、カメラのズーム機能を実装することも有効です。これは、カメラノードのfov(Field of View:視野角)プロパティを、マウスホイールのスクロールや特定のキー入力に応じて変更することで実現できます。

InputEventMouseButtonイベントでマウスホイールのスクロールを検出し、event.button_index == MOUSE_BUTTON_WHEEL_UP(上スクロール)またはevent.button_index == MOUSE_BUTTON_WHEEL_DOWN(下スクロール)で処理します。ズームイン(視野角を狭める)とズームアウト(視野角を広げる)の処理を、fovプロパティに加算・減算することで行います。

カメラの追従とラグ

一部のゲームでは、カメラがプレイヤーキャラクターに完全に追従するのではなく、わずかな遅延(ラグ)を持たせることで、よりダイナミックな視点表現を行うことがあります。これは、lerp()関数(線形補間)を使用して、カメラの目標位置(プレイヤーキャラクターの位置)と現在の位置の間を滑らかに移動させることで実現できます。これにより、急激な方向転換時などにカメラが追いつくような効果が得られます。

牛肉・豚肉・鶏肉・ジビエ情報

GodotでのFPS開発とは直接関連しませんが、ゲーム開発のインスピレーションや、ゲーム内の要素として活用できる情報として、食肉に関する情報を以下に示します。

牛肉

牛肉は、その赤身の色と豊かな風味で知られています。部位によって食感や調理法が大きく異なり、リブロースやサーロインのような高級部位はステーキに適していますが、バラ肉やモモ肉は煮込み料理やひき肉としても利用されます。ゲーム内で、食料アイテムとして回復アイテムや一時的なステータス向上バフとして登場させることができます。

豚肉

豚肉は、脂身の旨味と柔らかさが特徴です。バラ肉、ロース、肩ロースなど、様々な部位があり、それぞれに異なる用途があります。ベーコンやハムといった加工品も豊富です。ゲーム内では、比較的入手しやすく、汎用的な回復アイテムや、特定のレシピの材料として登場させると良いでしょう。

鶏肉

鶏肉は、脂肪が少なくヘルシーで、淡白な味わいが特徴です。もも肉、むね肉、ささみなど、部位によって食感や用途が異なります。比較的安価で入手しやすく、調理法も多様です。ゲーム内では、初期の回復アイテムや、手軽に入手できる食料として配置すると、プレイヤーの初期段階でのサバイバルを助けることができます。

ジビエ

ジビエとは、狩猟で得られた野生の鳥獣肉のことを指します。鹿肉、猪肉、鴨肉などが代表的です。ジビエは、飼育された肉とは異なる独特の風味と栄養価を持ち、近年注目されています。ゲームの世界観によっては、特定の地域でしか手に入らない希少な食料アイテムとして、あるいは特別なクラフト素材として登場させると、ゲームの深みが増します。

例えば、神秘的な森の奥地でしか手に入らない鹿肉は、特殊なスキルを習得するための材料になったり、強力なポーションの材料になったりするかもしれません。猪肉は、戦闘能力を一時的に上昇させる料理の材料として、鴨肉は、ステルス能力を向上させる料理の材料として設定するのも面白いでしょう。

まとめ

Godot EngineでFPSのカメラと視点移動を実装するには、ノードの適切な配置と、入力イベントの処理が鍵となります。マウスの動きをカメラの回転に結びつけ、キーボード入力をプレイヤーの移動に反映させることで、基本的な操作感を作り上げることができます。さらに、カメラの揺れやキャラクターアニメーションとの連携、ズーム機能や追従ラグといった高度なテクニックを取り入れることで、より没入感のあるゲーム体験をプレイヤーに提供することが可能となります。今回触れた食肉やジビエの情報も、ゲームの世界観を豊かにし、プレイヤーの戦略や探索の動機付けに繋がる要素として活用できるでしょう。