概要
CharacterBody2DのMotion Modeは、キャラクターの物理挙動を決定する重要な設定です。ゲームジャンルに応じて適切なモードを選択することで、期待通りの動作を実現できます。
最初にGodotでゲームを作り始めた時、キャラクターが勝手に落下して「なぜ!?」と困惑したのを覚えています。トップダウンゲームを作ろうとしていたのに、Motion Modeの存在を知らなかったんです。この経験から、プロジェクト開始時の基本設定の重要性を痛感しました。

Motion Modeの種類
1. Grounded (接地) - デフォルト
- 特徴: 重力が自動適用、床判定が機能
- 用途: プラットフォーマー、横スクロールアクション
- 利用可能:
is_on_floor()
,is_on_wall()
,is_on_ceiling()
2. Floating (浮遊)
- 特徴: 重力なし、床の概念なし
- 用途: トップダウン、見下ろし型ゲーム、シューティング
- 動作: XY平面を自由に移動
実装例
トップダウン型の移動(Floating)
# Player.gd (Motion Mode: Floating)
extends CharacterBody2D
@export var speed: float = 200.0
func _physics_process(delta):
var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down")
velocity = direction * speed
move_and_slide()
プラットフォーマー型の移動(Grounded)
# Player.gd (Motion Mode: Grounded)
extends CharacterBody2D
@export var speed = 300.0
@export var jump_velocity = -400.0
# Godotが自動的に重力を適用
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
func _physics_process(delta):
# 重力を追加
if not is_on_floor():
velocity.y += gravity * delta
# ジャンプ
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = jump_velocity
# 横移動
var direction = Input.get_axis("move_left", "move_right")
velocity.x = direction * speed
move_and_slide()
設定方法
- インスペクター: CharacterBody2D → Motion → Motion Mode
- コード:
func _ready(): motion_mode = CharacterBody2D.MOTION_MODE_FLOATING
よくある間違いと対処法
問題:トップダウンゲームでキャラクターが落下する
# 間違い:Motion ModeがGroundedのまま
extends CharacterBody2D
func _physics_process(delta):
# 重力が適用されて落下してしまう
var direction = Input.get_vector("left", "right", "up", "down")
velocity = direction * speed
move_and_slide()
解決:Motion ModeをFloatingに変更
インスペクターでMotion ModeをFloatingに設定するか、コードで明示的に指定します。
プロジェクト別の推奨設定
ゲームタイプ | Motion Mode | 理由 |
---|---|---|
ゼルダ風トップダウン | Floating | 重力不要、全方向移動 |
マリオ風プラットフォーマー | Grounded | 重力必須、床判定必要 |
横スクロールシューティング | Floating | 自由な移動が必要 |
メトロイドヴァニア | Grounded | 重力と壁判定が必要 |
注意点
- プロジェクト開始時に必ず確認(デフォルトはGrounded)
- 途中でモードを変更すると挙動が大きく変わる
- Floatingモードでは
is_on_floor()
は常にfalse
実装して学んだこと
Motion Modeの違いを理解してから、ゲームジャンルに応じた適切な設定ができるようになりました。特に印象的だったのは、同じmove_and_slide()
でも、Motion Modeによって全く違う挙動になることです。
最初は「なぜGroundedがデフォルトなんだろう?」と思いましたが、多くのゲームが重力を使うことを考えると納得できました。今では新規プロジェクトを始める時、真っ先にMotion Modeを確認する習慣がつきました。