Godot4で get_tree().create_timer() を使っていると、ゲームをポーズしてもタイマーが進み続けることがあります。
特に、弾の寿命管理や演出待ちに使っている場合、ポーズ中に弾が消える・演出が終わるといった不自然な挙動の原因になります。
この記事では、create_timer() の第2引数 process_always を false にして、ポーズに追従させる方法を解説します。
環境
- Godot4.5
- GDScript
設定方法
公式ドキュメントを読んでみます。
SceneTreeTimer create_timer(time_sec: float, process_always: bool = true, process_in_physics: bool = false, ignore_time_scale: bool = false)
公式ドキュメントより
create_timerの部分を読んでみると、第2引数に自動で trueが入る設定になっている。
第2引数 process_alwaysは falseを設定するとポーズを受け付けるようになります。
ポーズ中もタイマーが進む
await get_tree().create_timer(0.5).timeout
ポーズ中はタイマーも止まる
await get_tree().create_timer(0.5, false).timeout
実践例
プレイヤーから発射される弾に、作成されてから何秒後に弾を削除するプログラムを書きます。
extends Area2D
@export var speed = 250
var lifetime = 0.5 # 寿命を0.5秒に設定
func _ready() -> void:
# 関数を呼び出すタイマー
get_tree().create_timer(lifetime).timeout.connect(on_timer_timeout)
func _process(delta: float) -> void:
# 弾を前方に移動させる
position += transform.x * speed * delta
# 時間がきたら削除される
func on_timer_timeout():
queue_free()
このコードでは、弾を生成してから lifetime 秒後に削除します。
ただしこのままだと、ゲームをポーズしていてもタイマーが進むため、ポーズ中に弾が消えてしまいます。
実際の動作は以下の動画のようになります。
ここで、コードの8行目を変更することでタイマーがポーズを受け付けるようにします。
get_tree().create_timer(lifetime, false).timeout.connect(on_timer_timeout)
その結果、以下の動画のようにポーズ中には削除されなくなります。
こういう場面では特に注意
create_timer() のポーズ挙動は、次のような処理で特に重要です。
- 弾や敵オブジェクトの寿命管理
- 一定時間後に消えるエフェクト
- 演出の待ち時間
- クールタイム
- UI表示の一時遅延
「一定時間待つだけだから」と軽く使うと、
後からポーズ中にも進んでしまうバグにつながりやすいです。
まとめ
create_timerで作成したタイマーをポーズ可能にするには、
create_timerの第2引数にfalseを設定すればよい。💯
保守性不在のSNS





