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: 地形の追加

シーンにStaticBody3DCollisionShape3Dを追加し、地面を作成します。
簡易的な地形としてPlaneMeshを割り当てます。



ステップ6: テストプレイ

シーンを再生して、マウスとキーボードを使用してプレイヤーが移動・ジャンプできるか確認します。
マウス感度や移動速度が適切でない場合は、スクリプト内の定数を調整してください。

こちらから試しにプレイしてください!



次のステップ: 高度な機能の追加

プレイヤーに衝突判定を追加して、オブジェクトとの相互作用を可能にする。
カメラにエフェクトを追加して、没入感を高める。
サウンドやアニメーションを組み込む。

このチュートリアルで、三人称視点プレイヤーの基本的な動作を構築する方法を学べました。次は、ゲームの要素を追加してさらに魅力的な体験を提供しましょう!
最終更新日: 2025/01/10 01:12

コメント