はじめに
ゲーム開発において「時間経過」はとても重要な要素です。敵の出現間隔、スキルのクールタイム、カウントダウン表示など、あらゆる場面で一定の時間を測る必要があります。Godot 4のTimerノードは、こうした「時間を計る」という処理を簡単に実装するためのノードです。
Timerを使うことで、複雑なフレームカウント処理を書くことなく、シンプルで読みやすいコードでタイミング制御ができます。ゲームの基本的な仕組みから高度なゲームメカニクスまで、あらゆるシーンでお世話になる汎用的なノードです。
Timerとは?
Timerノードは、設定した時間が経過すると「timeout」シグナルを発火させるノードです。キッチンタイマーをイメージしてください。タイマーをセットして、時間が来ると「チン!」と音が鳴りますよね。Timerも同じで、wait_timeで設定した秒数が経過すると、シグナルを発火して「時間だよ!」と教えてくれます。
Timerの継承関係は以下の通りです。
Timer
↓
Node
シンプルな構成で、Nodeを継承しているため、任意のシーンに追加できます。

このノードを使うべき場面
- 敵の定期的な出現:ウェーブシューティングで敵を一定間隔で出現させたい
- スキルのクールタイム管理:プレイヤーがスキルを使った後、次に使えるまでの待機時間
- カウントダウン表示:ステージ開始前の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("スキルの準備ができました!")

もっと使いこなす:カスタマイズできるパラメータ
| パラメータ・テクニック | 変えると何が起きるか |
|---|---|
wait_timeを動的に変更 |
難度が上がるにつれ敵の出現間隔を短縮したり、スキルのクールタイムを減らせる。ゲームの進行状況に応じた動的な調整が可能 |
one_shot = true |
1回だけ発火して自動で停止。カウントダウンや遅延実行に最適。複数回発火させたい場合は手動でstart()を呼ぶ |
autostart = true |
シーンが読み込まれた瞬間にタイマーが自動開始。初期化忘れを防げるが、プログラムで開始タイミングを制御したい場合はfalseにする |
pausedプロパティを活用 |
ゲームを一時停止するときにタイマーも一時停止できる。get_tree().paused = trueでツリー全体が一時停止される |
| 複数のTimerを組み合わせ | 複数のタイマーを同時に運用して、異なるタイミング制御を独立に管理できる。例:敵出現 + 難度上昇 + 自動セーブ |
まとめ
Timerはゲーム開発の「時間管理の基本」です。シンプルながら非常に強力で、ほぼすべてのゲームで活躍します。プロパティの組み合わせ(one_shot、autostartなど)を理解することで、様々な時間制御シーンに対応できます。
- Timerは「待機時間が経過すると信号を送る」という単純かつ強力な役割を担う
one_shotとautostartの使い分けで、1回限り実行か繰り返し実行かを制御できる- シグナルの
timeoutに関数を接続して、時間経過時の処理を定義する
次回は、より複雑なアニメーションを実現するTweenノードについて解説します。Timerで「いつ」を制御し、Tweenで「どのように変化するか」を制御する、という組み合わせが可能になります。
シリーズ:Godot 4 ノード解説
- 001〜035:各種ノード
- 036:PopupMenu
- 037:FileDialog
- 038〜080:その他のノード
- 081:Timer(この記事)
- 082:Tween
- 083:HTTPRequest
- 084:Line2D
- 085:Polygon2D
この記事はGodot 4.xをもとに執筆しています。


コメント