Godot入門:Timerの使い方と活用法

はじめに

ゲーム開発において「時間経過」はとても重要な要素です。敵の出現間隔、スキルのクールタイム、カウントダウン表示など、あらゆる場面で一定の時間を測る必要があります。Godot 4のTimerノードは、こうした「時間を計る」という処理を簡単に実装するためのノードです。

Timerを使うことで、複雑なフレームカウント処理を書くことなく、シンプルで読みやすいコードでタイミング制御ができます。ゲームの基本的な仕組みから高度なゲームメカニクスまで、あらゆるシーンでお世話になる汎用的なノードです。

Timerとは?

Timerノードは、設定した時間が経過すると「timeout」シグナルを発火させるノードです。キッチンタイマーをイメージしてください。タイマーをセットして、時間が来ると「チン!」と音が鳴りますよね。Timerも同じで、wait_timeで設定した秒数が経過すると、シグナルを発火して「時間だよ!」と教えてくれます。

Timerの継承関係は以下の通りです。

Timer

Node

シンプルな構成で、Nodeを継承しているため、任意のシーンに追加できます。




Timerノードの動作フロー
Timerは待機→発火→リセットというサイクルを繰り返します

このノードを使うべき場面

  • 敵の定期的な出現:ウェーブシューティングで敵を一定間隔で出現させたい
  • スキルのクールタイム管理:プレイヤーがスキルを使った後、次に使えるまでの待機時間
  • カウントダウン表示:ステージ開始前の3・2・1カウント、制限時間表示
  • 定期的な処理実行:敵のAI判定、自動セーブ、背景スクロール

別のノードが適切な場面

連続的でスムーズなアニメーション(キャラの移動、フェードアウト)が必要な場合は、TimerよりTweenノードの方が向いています。また、1フレーム単位で細かく制御したい場合は_process(delta)で直接時間管理する方法もあります。

主なプロパティと機能

プロパティ・メソッド 役割
wait_time float タイマーが発火するまでの秒数(デフォルト: 1.0秒)
one_shot bool trueなら1回だけ発火してリセット、falseなら繰り返し発火
autostart bool trueなら_ready()時に自動でタイマー開始
time_left float 残り時間(読み取り専用)。デバッグやUI表示に使える
start(wait_time: float) void タイマーを開始。引数で待機時間を上書きできる
stop() void タイマーを停止。time_leftは保持されたまま
is_stopped() bool タイマーが停止中ならtrue
timeout Signal wait_timeが経過したとき発火するシグナル

コード例1:基本的な敵出現システム

extends Node2D

@export var enemy_scene: PackedScene
@export var spawn_interval: float = 2.0

func _ready() -> void:
    # Timerノードをコードで生成
    var timer = Timer.new()
    timer.wait_time = spawn_interval
    timer.timeout.connect(_on_timer_timeout)
    add_child(timer)
    timer.start()

func _on_timer_timeout() -> void:
    # wait_timeごとにこの関数が呼ばれる
    var enemy = enemy_scene.instantiate()
    enemy.position = Vector2(randf_range(0, 800), 0)
    add_child(enemy)
    print("敵が出現しました!残り敵数: ", get_child_count())

コード例2:スキルのクールタイム管理

extends Node

var skill_cooldown_timer: Timer
var is_skill_ready: bool = true

func _ready() -> void:
    # クールタイム用のタイマーを作成
    skill_cooldown_timer = Timer.new()
    skill_cooldown_timer.one_shot = true  # 1回だけ発火
    skill_cooldown_timer.timeout.connect(_on_cooldown_finished)
    add_child(skill_cooldown_timer)

func use_skill() -> void:
    if not is_skill_ready:
        print("スキルはまだ使えません。残り時間: %.1f秒" % skill_cooldown_timer.time_left)
        return

    print("スキル発動!")
    is_skill_ready = false
    # クールタイムを5秒に設定して開始
    skill_cooldown_timer.start(5.0)

func _on_cooldown_finished() -> void:
    is_skill_ready = true
    print("スキルの準備ができました!")




Timerの活用例
Timerはシーンツリーに追加してインスペクタで設定するだけで使えます

もっと使いこなす:カスタマイズできるパラメータ

パラメータ・テクニック 変えると何が起きるか
wait_timeを動的に変更 難度が上がるにつれ敵の出現間隔を短縮したり、スキルのクールタイムを減らせる。ゲームの進行状況に応じた動的な調整が可能
one_shot = true 1回だけ発火して自動で停止。カウントダウンや遅延実行に最適。複数回発火させたい場合は手動でstart()を呼ぶ
autostart = true シーンが読み込まれた瞬間にタイマーが自動開始。初期化忘れを防げるが、プログラムで開始タイミングを制御したい場合はfalseにする
pausedプロパティを活用 ゲームを一時停止するときにタイマーも一時停止できる。get_tree().paused = trueでツリー全体が一時停止される
複数のTimerを組み合わせ 複数のタイマーを同時に運用して、異なるタイミング制御を独立に管理できる。例:敵出現 + 難度上昇 + 自動セーブ

まとめ

Timerはゲーム開発の「時間管理の基本」です。シンプルながら非常に強力で、ほぼすべてのゲームで活躍します。プロパティの組み合わせ(one_shotautostartなど)を理解することで、様々な時間制御シーンに対応できます。

  • Timerは「待機時間が経過すると信号を送る」という単純かつ強力な役割を担う
  • one_shotautostartの使い分けで、1回限り実行か繰り返し実行かを制御できる
  • シグナルのtimeoutに関数を接続して、時間経過時の処理を定義する

次回は、より複雑なアニメーションを実現するTweenノードについて解説します。Timerで「いつ」を制御し、Tweenで「どのように変化するか」を制御する、という組み合わせが可能になります。

シリーズ:Godot 4 ノード解説

この記事はGodot 4.xをもとに執筆しています。

コメント