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.0〜5.0くらいにすると、明確な「回避アクション」として機能します。 - Duration:
0.1〜0.2秒などの短時間がおすすめ。長くしすぎると制御不能になります。
3. このコンポーネントのポイント
コードによる連携(疎結合)
このコンポーネントは、親ノード(Player)を直接いじるのではなく、「移動を担当している別のコンポーネント(KeyboardMover)」 に干渉します。
これにより、以下のような柔軟性が生まれます。
- ダッシュ機能の付け外しが自由:
DashMechanicノードを削除(またはDisable)すれば、即座に「ダッシュできないキャラ」になります。移動コードを書き換える必要はありません。 - 状態異常の実装に応用可能: このロジック(速度変数を一時的に変える)は、そのまま「泥沼に入って遅くなる」「敵の魔法で動きが鈍る」といった処理に転用できます。
await による非同期処理
Godot 4では await get_tree().create_timer(秒数).timeout という書き方が推奨されています。
これにより、インスペクターに大量のTimerノードを追加することなく、スクリプト内だけで時間経過の処理(持続→終了→クールダウン)を直感的に書くことができます。
