Godotのリストに戻る

【Godot】CharacterBody2DのMotion Mode:トップダウンと横スクロールの使い分け

作成: 2025-06-20更新: 2025-06-20移動・物理ブログ記事を読む

概要

CharacterBody2DのMotion Modeは、キャラクターの物理挙動を決定する重要な設定です。ゲームジャンルに応じて適切なモードを選択することで、期待通りの動作を実現できます。

最初にGodotでゲームを作り始めた時、キャラクターが勝手に落下して「なぜ!?」と困惑したのを覚えています。トップダウンゲームを作ろうとしていたのに、Motion Modeの存在を知らなかったんです。この経験から、プロジェクト開始時の基本設定の重要性を痛感しました。

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()

設定方法

  1. インスペクター: CharacterBody2D → Motion → Motion Mode
  2. コード:
    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を確認する習慣がつきました。