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

はじめに

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

VehicleBody3Dとは?

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

継承ツリー:

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

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

使うべき場面:

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

使わない場面:

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

主なプロパティと機能

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

VehicleWheel3Dの重要プロパティ

プロパティ説明使用例
use_as_tractionboolこのタイヤがエンジン駆動を受けるか(駆動輪)wheel.use_as_traction = true(前輪2つ、後輪2つなど)
use_as_steeringboolこのタイヤがハンドル操作に反応するか(操舵輪)wheel.use_as_steering = true(通常は前輪)
wheel_radiusfloatタイヤの半径(m)wheel.wheel_radius = 0.4
suspension_stiffnessfloatサスペンションの硬さ(大きいほど硬い)wheel.suspension_stiffness = 15.0
suspension_travelfloatサスペンションの最大移動距離(m)wheel.suspension_travel = 0.3
friction_slipfloatタイヤのグリップ力(大きいほど滑りにくい)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_scalefloat重力の影響度(デフォルト1.0)vehicle.gravity_scale = 1.5
linear_dampfloat空気抵抗(大きいほど速度が減速する)vehicle.linear_damp = 0.1
angular_dampfloat回転方向の空気抵抗vehicle.angular_damp = 0.5
wheel.dampingfloatサスペンションのダンピング(振動減衰)wheel.damping = 0.3
wheel.roll_influencefloatロールオーバー時の安定性(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.xをもとに執筆しています。

コメント