概要
プレイヤーの操作に正確に反応するゲームを作るには、キー入力の「状態」を正しく理解することが不可欠です。「キーが押されている間ずっと」なのか、「キーが押された瞬間だけ」なのか。この違いを使い分けることで、キャラクターの動きは格段に良くなります。
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()
この基本を覚えて、ぜひあなたのゲームに活かしてみてください。