Godot 4のコンポーネント指向開発シリーズ、アクションゲームに爽快感を与える**「DashMechanic (ダッシュ機能)」**です。

今回は、以前に作った「KeyboardMover」と連携して、一時的に移動速度を限界突破させる仕組みを作ります。


このコンポーネントは、ボタンが押されると、兄弟ノード(KeyboardMoverなど)の移動速度変数を一時的に書き換え、時間が経つと元に戻します。Timerノードを使わず、GDScriptの await 機能でスマートに実装します。

1. コンポーネントのコード (Full Code)

以下のコードをコピーして、DashMechanic.gd という名前で保存してください。

class_name DashMechanic
extends Node

## 入力時、移動コンポーネントの速度を一時的に倍増させるコンポーネント
## 前提: 兄弟ノードに "KeyboardMover" (または speed 変数を持つノード) が必要です。

# --- 設定パラメータ ---
@export_group("Dash Settings")
@export var speed_multiplier: float = 3.0   ## 速度倍率(2.0なら2倍、3.0なら3倍)
@export var duration: float = 0.2           ## ダッシュの持続時間(秒)
@export var cooldown: float = 1.0           ## 再使用までの待機時間(秒)
@export var dash_action: String = "ui_accept" ## ダッシュボタン(デフォルトはSpace/Enter)

# --- 内部変数 ---
var _mover_node: Node     # 操作対象の移動コンポーネント
var _can_dash: bool = true # ダッシュ可能フラグ

func _ready() -> void:
	# 兄弟ノードから KeyboardMover を探す
	# (名前が変わっている場合はここを修正するか、Export変数で指定できるようにしてください)
	_mover_node = get_parent().get_node_or_null("KeyboardMover")
	
	if not _mover_node or not "speed" in _mover_node:
		push_error("DashMechanic: 'KeyboardMover' ノードが見つからないか、speed変数がありません。")
		set_process_input(false)

func _input(event: InputEvent) -> void:
	# ダッシュボタンが押され、かつクールダウン中でなければ発動
	if event.is_action_pressed(dash_action) and _can_dash:
		_perform_dash()

func _perform_dash() -> void:
	_can_dash = false
	
	# 1. 現在の速度を保存し、倍率をかける
	var original_speed = _mover_node.speed
	_mover_node.speed *= speed_multiplier
	
	# --- 演出用(オプション) ---
	# 親のスプライトを一瞬赤くする等(デバッグ用)
	var parent_sprite = get_parent().get_node_or_null("Sprite2D")
	if parent_sprite: parent_sprite.modulate = Color.RED
	# -----------------------

	# 2. 持続時間だけ待つ (Timerノード不要!)
	await get_tree().create_timer(duration).timeout
	
	# 3. 速度を元に戻す
	_mover_node.speed = original_speed
	if parent_sprite: parent_sprite.modulate = Color.WHITE # 色戻し
	
	# 4. クールダウン時間だけ待つ
	await get_tree().create_timer(cooldown).timeout
	
	# 5. 再使用可能にする
	_can_dash = true

2. 使い方チュートリアル

このコンポーネントは、第1回で作成した KeyboardMover の能力を強化(ブースト) する形で動作します。

手順①:準備(キー設定)

Godotのメニューから プロジェクト > プロジェクト設定 > インプットマップ を開き、新しいアクション dash を追加してください(ShiftキーやZキーなどを割り当てるとゲームらしくなります)。

※ スクリプト内の dash_action プロパティにも、設定した名前(”dash”)を入力してください。デフォルトのままだとジャンプと同じキー(Space)になってしまいます。

手順②:コンポーネントをアタッチ

プレイヤー(CharacterBody2D)の子ノードに、作成した DashMechanic を追加します。

シーン構成図:

Plaintext

Player (CharacterBody2D)
 ├── Sprite2D
 ├── CollisionShape2D
 ├── KeyboardMover (Node)  <-- こいつの数値を書き換えます
 └── DashMechanic (Node)   <-- 今回追加!

手順③:ノード名を確認する

スクリプト内で get_node("KeyboardMover") と指定しているので、第1回で作った移動用ノードの名前が KeyboardMover のままであることを確認してください。(もし違う名前なら、リネームするかスクリプトを修正してください)

手順④:実行と調整

ゲームを実行し、移動しながらダッシュキーを押してください。

一瞬だけギュン!と加速し、その後クールダウンが終わるまで再使用できなければ成功です。

  • Speed Multiplier: 3.05.0 くらいにすると、明確な「回避アクション」として機能します。
  • Duration: 0.10.2 秒などの短時間がおすすめ。長くしすぎると制御不能になります。

3. このコンポーネントのポイント

コードによる連携(疎結合)

このコンポーネントは、親ノード(Player)を直接いじるのではなく、「移動を担当している別のコンポーネント(KeyboardMover)」 に干渉します。

これにより、以下のような柔軟性が生まれます。

  • ダッシュ機能の付け外しが自由: DashMechanic ノードを削除(またはDisable)すれば、即座に「ダッシュできないキャラ」になります。移動コードを書き換える必要はありません。
  • 状態異常の実装に応用可能: このロジック(速度変数を一時的に変える)は、そのまま「泥沼に入って遅くなる」「敵の魔法で動きが鈍る」といった処理に転用できます。

await による非同期処理

Godot 4では await get_tree().create_timer(秒数).timeout という書き方が推奨されています。

これにより、インスペクターに大量のTimerノードを追加することなく、スクリプト内だけで時間経過の処理(持続→終了→クールダウン)を直感的に書くことができます。