【Godot】入力判定メソッドの使い分け|just_pressed、pressed、released

作成: 2025-06-20最終更新: 2025-12-06

Godotの入力判定メソッドの違いと適切な使い分け。ジャンプ、移動、チャージ攻撃などの実装例

概要

プレイヤーの操作に正確に反応するゲームを作るには、キー入力の「状態」を正しく理解することが不可欠です。「キーが押されている間ずっと」なのか、「キーが押された瞬間だけ」なのか。この違いを使い分けることで、キャラクターの動きは格段に良くなります。

Godotでは、この入力判定を簡単に行うための3つの便利なメソッドが用意されています。

  • is_action_pressed()
  • is_action_just_pressed()
  • is_action_released()

この記事では、これらのメソッドの違いと、それぞれの最適な使いどころを具体例と共に解説します。

3つの入力判定メソッド

これらのメソッドは、Inputシングルトン(どこからでもアクセスできる便利なオブジェクト)を通じて呼び出します。引数には、InputMapで設定したアクション名(例: "ui_accept", "move_right")を指定します。

メソッド判定タイミング主な用途
is_action_pressed()アクションが押されている間ずっとキャラクターの移動、連射
is_action_just_pressed()アクションが押された最初の1フレームだけジャンプ、決定、単発の射撃
is_action_released()アクションが離された最初の1フレームだけ溜め撃ちの解放、ジャンプの高さ調整

_process_physics_processのような毎フレーム呼ばれる関数の中で使うことで、その瞬間の入力状態をチェックできます。

実践例:キャラクターの移動とジャンプ

2Dプラットフォーマーのキャラクターを例に、これらのメソッドをどう使い分けるか見てみましょう。

extends CharacterBody2D

const SPEED = 300.0
const JUMP_VELOCITY = -400.0

# プロジェクト設定から重力を取得
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")
    if direction:
        velocity.x = direction * SPEED
    else:
        velocity.x = move_toward(velocity.x, 0, SPEED)

    # 溜め攻撃の解放: 離した「瞬間」に実行
    if Input.is_action_released("charge_attack"):
        print("溜め攻撃を放った!")

    move_and_slide()

このコードでは、

  • 左右の移動 にはis_action_pressedの挙動を持つInput.get_axis()を使用しています。これにより、キーを押し続けている間、キャラクターは移動し続けます。
  • ジャンプ にはis_action_just_pressedを使用しています。これにより、ジャンプボタンを押しっぱなしにしても、一度しかジャンプしません。もしここでis_action_pressedを使うと、キャラクターは地面にいる限り毎フレームジャンプしようとしてしまいます。
  • 溜め攻撃 にはis_action_releasedを使用しています。ボタンを離した瞬間に攻撃が発動する、といったロジックを組むことができます。

まとめ

入力判定はゲームの触り心地(ゲームフィール)を決定づける重要な要素です。Godotが用意してくれている3つのメソッドを正しく使い分けることで、より直感的でレスポンスの良い操作性を実現できます。

  • 移動のように継続的なアクションには is_action_pressed()
  • ジャンプ決定のような単発のアクションには is_action_just_pressed()
  • 溜め解放のような特殊なアクションには is_action_released()

この基本を覚えて、ぜひあなたのゲームに活かしてみてください。