Godot入門:VehicleBody3Dの使い方と活用法

はじめに

レーシングゲームやドライビングシミュレーター、探索ゲームで乗り物を扱いたいとき、単純な物理では不十分です。VehicleBody3Dなら、サスペンション・タイヤ・ステアリングを含む本格的な車両物理を簡単に実装できます。このノードはWASDキーでの操作に対応させるだけで、リアルな乗り物の挙動を再現します。

VehicleBody3Dとは?

VehicleBody3Dは、車両(自動車、バイク、乗り物)の物理演算を実現するノードです。RigidBody3Dを拡張した特殊なボディで、VehicleWheel3Dを子ノードとして4つ(または複数)配置することで、エンジン駆動・ステアリング・サスペンション・ブレーキなどの車両機構を再現します。

継承ツリー:

VehicleBody3D
  ↓
RigidBody3D
  ↓
PhysicsBody3D
  ↓
CollisionObject3D
  ↓
Node3D
  ↓
Node




VehicleBody3Dとタイヤの構成
VehicleBody3Dを中心にして、4つのVehicleWheel3Dを配置。各タイヤが地面と接触して物理演算が動作します

このノードを使うべき場面

使うべき場面:

  • レースゲームやドライビングシミュレーターの実装
  • 3Dアクションゲームの乗り物(車、バイク、戦車)
  • 探索ゲームやRPGにおける移動手段の乗り物化
  • 物理エンジンと連動した現実的な加速・ブレーキ・ハンドルの挙動
  • タイヤのスリップやグリップを考慮した走行物理

使わない場面:

  • 単純な移動物体(通常のRigidBody3Dで十分)
  • 飛行物体や水上移動(AirshipBody3DやWaterBody3Dが適切)

主なプロパティと機能

プロパティ 説明 使用例
engine_force float エンジンの駆動力(プラスで前進、マイナスで後退) vehicle.engine_force = 500.0
brake float ブレーキの制動力(0~1000) vehicle.brake = 100.0
steering float ハンドルの角度(ラジアン、左負数・右正数) vehicle.steering = 0.2
mass float 車体の質量(kg。デフォルト1) vehicle.mass = 1000.0
linear_velocity Vector3 現在の移動速度 print(vehicle.linear_velocity.length())

VehicleWheel3Dの重要プロパティ

プロパティ 説明 使用例
use_as_traction bool このタイヤがエンジン駆動を受けるか(駆動輪) wheel.use_as_traction = true(前輪2つ、後輪2つなど)
use_as_steering bool このタイヤがハンドル操作に反応するか(操舵輪) wheel.use_as_steering = true(通常は前輪)
wheel_radius float タイヤの半径(m) wheel.wheel_radius = 0.4
suspension_stiffness float サスペンションの硬さ(大きいほど硬い) wheel.suspension_stiffness = 15.0
suspension_travel float サスペンションの最大移動距離(m) wheel.suspension_travel = 0.3
friction_slip float タイヤのグリップ力(大きいほど滑りにくい) wheel.friction_slip = 10.5

GDScriptコード例1:基本的な車両操作


extends VehicleBody3D

@export var max_engine_force = 400.0
@export var max_brake_force = 100.0
@export var max_steer_angle = 0.4

func _physics_process(delta):
    # キー入力の取得
    var input_vector = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")

    # ハンドル操作(左右)
    steering = move_toward(steering, input_vector.x * max_steer_angle, 2.0 * delta)

    # アクセルとブレーキ
    if input_vector.y > 0:
        engine_force = max_engine_force * input_vector.y
        brake = 0.0
    elif input_vector.y < 0:
        engine_force = 0.0
        brake = max_brake_force * -input_vector.y
    else:
        engine_force = 0.0
        brake = 0.0

    # 速度の表示(デバッグ用)
    var speed_kmh = linear_velocity.length() * 3.6
    print("速度: %.1f km/h" % speed_kmh)

GDScriptコード例2:オフロード車の設定(サスペンション調整)


extends VehicleBody3D

func _ready():
    # 車体設定
    mass = 1200.0

    # 4つのタイヤを設定
    var wheels = get_children().filter(func(child): return child is VehicleWheel3D)

    for i in range(min(4, wheels.size())):
        var wheel = wheels[i]

        # 基本設定
        wheel.wheel_radius = 0.5
        wheel.suspension_travel = 0.4  # オフロード用に大きめ
        wheel.suspension_stiffness = 8.0  # 柔らかめ(凸凹対応)
        wheel.friction_slip = 12.0  # グリップ力を高める

        # 駆動輪・操舵輪の設定
        if i < 2:  # 前輪
            wheel.use_as_steering = true
            wheel.use_as_traction = true
        else:  # 後輪
            wheel.use_as_steering = false
            wheel.use_as_traction = true

    print("オフロード車が準備できました")

もっと使いこなす:カスタマイズできるパラメータ

まずは基本を動かしてみてから、余裕が出たら試してみてください。

パラメータ 説明 実装例
gravity_scale float 重力の影響度(デフォルト1.0) vehicle.gravity_scale = 1.5
linear_damp float 空気抵抗(大きいほど速度が減速する) vehicle.linear_damp = 0.1
angular_damp float 回転方向の空気抵抗 vehicle.angular_damp = 0.5
wheel.damping float サスペンションのダンピング(振動減衰) wheel.damping = 0.3
wheel.roll_influence float ロールオーバー時の安定性(0~1) wheel.roll_influence = 0.1
get_speed_kmh() メソッド 現在速度をkm/hで取得 var speed = linear_velocity.length() * 3.6

カスタマイズの実装例:ギアシステムの追加


extends VehicleBody3D

var current_gear = 1
var max_gear = 5
var engine_rpm = 0.0

@export var max_engine_force_per_gear = [100.0, 200.0, 300.0, 350.0, 400.0]

func _physics_process(delta):
    var input_vector = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")

    # ギアチェンジ
    if Input.is_action_just_pressed("ui_up") and current_gear < max_gear:
        current_gear += 1
    if Input.is_action_just_pressed("ui_down") and current_gear > 1:
        current_gear -= 1

    # ギアに応じた駆動力を適用
    var max_force = max_engine_force_per_gear[current_gear - 1]
    engine_force = max_force * input_vector.y

    steering = input_vector.x * 0.4

    print("ギア: %d" % current_gear)

まとめ

VehicleBody3Dは、ゲームに本格的な車両物理をもたらす最強のノードです。

  • RigidBody3Dを拡張した車両専用ボディで、現実的な加速・ブレーキ・ハンドルが実装できます
  • VehicleWheel3Dを4つ配置するだけで、タイヤの接地・サスペンション・駆動が自動で動作します
  • ゲーム内の乗り物や移動手段として、大きな表現の幅が広がります

次回は、TPS・アクションカメラに最適な「SpringArm3D」について詳しく解説します。

シリーズ:Godot 4 ノード解説

001~040:各種ノード

041~080:
041: Marker3D | 042: Node3D | 043: Camera3D | 044: Light3D | 045: MeshInstance3D |
046: AnimationPlayer | 047: AnimationTree | 048: Skeleton3D | 049: IKSkeleton3D | 050: Skin |
051: CollisionShape3D | 052: RigidBody3D | 053: CharacterBody3D | 054: StaticBody3D | 055: Area3D |
056: PhysicsDirectSpaceState3D | 057: ShapeCast3D | 058: RayCast3D | 059: Decal | 060: GPUParticles3D |
061: CPUParticles3D | 062: WorldEnvironment | 063: OmniLight3D | 064: SpotLight3D | 065: DirectionalLight3D |
066: ReflectionProbe | 067: LightmapGI | 068: VoxelGI | 069: Occluder3D | 070: VisualInstance3D |
071: BoneAttachment3D | 072: VehicleBody3D | 073: SpringArm3D | 074: RayCast3D | 075: ShapeCast3D |
076: MultiMeshInstance3D | 077: Node | 078: CanvasLayer | 079: Control | 080: Label

この記事はGodot 4.xをもとに執筆しています。

コメント