Godotで三人称視点のプレイヤーを作成する方法
Godot Engine バージョン4.3
このチュートリアルでは、Godot 4.3を使用して、三人称視点の3Dプレイヤーを構築する方法をステップバイステップで解説します。カメラ操作、移動、ジャンプを組み合わせた基本的なプレイヤー制御の実装を学べます。
ステップ1: プロジェクトの準備
新しいプロジェクトを作成し、3Dシーンを設定します。
シーン内に以下のノードを追加します:
- Main:Node3D(ルートノード)
- Player:CharacterBody3D(プレイヤーキャラクターの移動を担当)
- DirectionalLight3D:DirectionalLight3D(明るさを担当)
- WorldEnvironment:WorldEnvironment(空フィールドを担当)
- Plane:StaticBody3D(地面)
ステップ2: ノード構造の作成
メインの最終的なノード構造は以下のようになります:
Player
を選択し、位置を 0, 1, 0
に設定します(地面から少し浮かせる)。プレイヤーの最終的なノード構造は以下のようになります:
- RayCast3Dは、カメラが壁などに衝突しているか確認します。三人称視点なので障害物がカメラとプレイヤーの間にある場合は衝突点までの距離を取得して、カメラを適切な位置に移動するようにスクリプトで実装します。
ステップ3: プレイヤー制御スクリプト
Player(CharacterBody3D)に以下のスクリプトを追加します。
extends CharacterBody3D
# キャラクターの移動速度const SPEED = 5.0# ジャンプ時の上昇速度const JUMP_VELOCITY = 4.5# 重力をプロジェクト設定から取得var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
# マウス感度を設定(値を小さくすると動きが遅くなり、大きくすると速くなる)var sens = 0.005
# ノードの参照を取得@onready var head = $Head # キャラクターの「頭」のノード@onready var camera = $Head/Camera3D # 頭にアタッチされたカメラ@onready var camera_collition_ray = $Head/RayCast3D # カメラの衝突検知用RayCast
# 毎フレームの物理処理を行うfunc _physics_process(delta): # カメラが壁などに衝突しているか確認 if camera_collition_ray.is_colliding(): # 衝突点までの距離を取得して、カメラを適切な位置に移動 camera.position.z = camera_collition_ray.get_collision_point().distance_to(camera_collition_ray.global_position) - 0.15 else: # 衝突がない場合、カメラを通常の位置に設定 camera.position.z = 3.5 # キャラクターが地面にいない場合、重力を適用して落下させる if not is_on_floor(): velocity.y -= gravity * delta
# ジャンプボタン("jump")が押され、キャラクターが地面にいる場合、ジャンプを実行 if Input.is_action_just_pressed("jump") and is_on_floor(): velocity.y = JUMP_VELOCITY
# 入力から移動方向を取得(上下左右の入力を2Dベクトルとして受け取る) var input_dir = Input.get_vector("left", "right", "up", "down") # 入力方向を3D空間に変換し、正規化して方向ベクトルを計算 var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
# 入力がある場合、指定した速度で移動 if direction: velocity.x = direction.x * SPEED velocity.z = direction.z * SPEED else: # 入力がない場合、移動を徐々に停止させる velocity.x = move_toward(velocity.x, 0, SPEED) velocity.z = move_toward(velocity.z, 0, SPEED) # 物理エンジンを使用してキャラクターを移動させる move_and_slide()
# 入力イベントを処理する関数func _input(event): # マウスが動いた時の処理 if event is InputEventMouseMotion: # マウスの横方向の動きに応じて親ノードを回転させる(水平回転) head.get_parent().rotate_y(-event.relative.x * sens) # マウスの縦方向の動きに応じて「頭」を回転させる(垂直回転) head.rotate_x(-event.relative.y * sens) # 垂直回転の角度を上下90度に制限(カメラが上下に振り切らないようにする) head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(90))
ステップ4: 入力マッピングの設定
プロジェクト設定で以下のアクションを追加し、キーを割り当てます:
up
: W
down
: S
left
: A
right
: D
jump
: Space
escape
: Escape
ステップ5: 地形の追加
シーンにStaticBody3DとCollisionShape3Dを追加し、地面を作成します。
簡易的な地形として
PlaneMesh
を割り当てます。
ステップ6: テストプレイ
シーンを再生して、マウスとキーボードを使用してプレイヤーが移動・ジャンプできるか確認します。
マウス感度や移動速度が適切でない場合は、スクリプト内の定数を調整してください。
次のステップ: 高度な機能の追加
プレイヤーに衝突判定を追加して、オブジェクトとの相互作用を可能にする。
カメラにエフェクトを追加して、没入感を高める。
サウンドやアニメーションを組み込む。
このチュートリアルで、三人称視点プレイヤーの基本的な動作を構築する方法を学べました。次は、ゲームの要素を追加してさらに魅力的な体験を提供しましょう!