Godotのリストに戻る

【Godot】InputMapによるキーバインド管理

作成: 2025-06-20更新: 2025-06-20入力処理ブログ記事を読む

概要

GodotのInput Mapは、物理的なキー("Aキー")を抽象的なアクション名("move_left")に変換する機能です。これにより、コードの可読性向上とキーコンフィグ機能の実装が容易になります。

最初はInput Mapを使わずに、Input.is_key_pressed(KEY_A)のように直接キーを指定していました。でも「キーボードとゲームパッド両方に対応したい」と思った時、コードがどんどん複雑になってしまいました。Input Mapを使うようになってからは、コードがすっきりし、キー設定の変更も簡単になりました。

設定方法

プロジェクト設定 → Input Map

Input Map設定画面
  1. アクション名を追加(例:move_left
  2. キーを割り当て(複数可能)
    • Aキー
    • 左矢印キー
    • ゲームパッド左スティック左

基本的な使い方

単一入力の取得

func _process(delta):
    # 単発の入力(押された瞬間)
    if Input.is_action_just_pressed("interact"):
        open_chest()
    
    # 継続的な入力(押されている間)
    if Input.is_action_pressed("dash"):
        speed = DASH_SPEED
    else:
        speed = NORMAL_SPEED

2軸入力の取得(便利!)

func _physics_process(delta):
    # 4つのアクションから正規化されたVector2を返す
    var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down")
    velocity = direction * speed
    move_and_slide()

Input.get_vector()の利点

# 従来の方法(冗長)
var direction = Vector2.ZERO
if Input.is_action_pressed("move_left"):
    direction.x -= 1
if Input.is_action_pressed("move_right"):
    direction.x += 1
if Input.is_action_pressed("move_up"):
    direction.y -= 1
if Input.is_action_pressed("move_down"):
    direction.y += 1
direction = direction.normalized()

# get_vector()を使った方法(簡潔)
var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down")
  • 自動的に正規化されたVector2を返す
  • 斜め移動時も適切な速度を保つ
  • アナログスティックの傾きも考慮

実践的な活用例

プレイヤーの8方向移動

extends CharacterBody2D

@export var speed = 200.0
@export var dash_speed = 400.0

func _physics_process(delta):
    var direction = Input.get_vector("move_left", "move_right", "move_up", "move_down")
    
    # ダッシュ判定
    var current_speed = dash_speed if Input.is_action_pressed("dash") else speed
    
    velocity = direction * current_speed
    move_and_slide()
    
    # アニメーション更新
    update_animation(direction)

func update_animation(direction: Vector2):
    if direction.length() > 0:
        if abs(direction.x) > abs(direction.y):
            # 横方向が優先
            $AnimatedSprite2D.play("walk_right" if direction.x > 0 else "walk_left")
        else:
            # 縦方向が優先
            $AnimatedSprite2D.play("walk_down" if direction.y > 0 else "walk_up")
    else:
        $AnimatedSprite2D.stop()

動的なキーコンフィグ

# キー変更機能の実装例
func change_key_binding(action: String, new_key: InputEvent):
    # 既存のキーをクリア
    InputMap.action_erase_events(action)
    # 新しいキーを追加
    InputMap.action_add_event(action, new_key)
    # 設定を保存
    save_key_config()

推奨されるアクション名

アクション名用途デフォルトキー例
move_left/right/up/down移動WASD, 矢印キー
interact調べる、話すE, Space
attack攻撃Z, マウス左
dashダッシュShift
pauseポーズEsc, Start

注意点

  • アクション名は分かりやすく統一感のある命名を心がける
  • 同じキーを複数のアクションに割り当てると競合する
  • プロジェクト設定で定義したアクションのみ使用可能

実装して学んだこと

Input Mapの一番の恩恵はInput.get_vector()関数です。以前は8方向移動の実装に何十行もコードを書いていましたが、この関数のおかげでたった1行に!さらにアナログスティックの入力も自動的に処理してくれるので、コントローラー対応も楽になりました。

アクション名の命名ルールも重要です。最初は「左」「右」のような日本語を使っていましたが、チーム開発やドキュメントを考えると英語の方がいいと気づきました。「move_left」のように「動作_方向」の形式に統一すると、コードがとても読みやすくなります。