はじめに
レーシングゲームやドライビングシミュレーター、探索ゲームで乗り物を扱いたいとき、単純な物理では不十分です。VehicleBody3Dなら、サスペンション・タイヤ・ステアリングを含む本格的な車両物理を簡単に実装できます。このノードはWASDキーでの操作に対応させるだけで、リアルな乗り物の挙動を再現します。
VehicleBody3Dとは?
VehicleBody3Dは、車両(自動車、バイク、乗り物)の物理演算を実現するノードです。RigidBody3Dを拡張した特殊なボディで、VehicleWheel3Dを子ノードとして4つ(または複数)配置することで、エンジン駆動・ステアリング・サスペンション・ブレーキなどの車両機構を再現します。
継承ツリー:
VehicleBody3D ↓ RigidBody3D ↓ PhysicsBody3D ↓ CollisionObject3D ↓ Node3D ↓ Node

このノードを使うべき場面
使うべき場面:
- レースゲームやドライビングシミュレーターの実装
- 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をもとに執筆しています。


コメント