【Godot4】create_timerがポーズ中も進む原因と停止させる方法

Godot4で get_tree().create_timer() を使っていると、ゲームをポーズしてもタイマーが進み続けることがあります。
特に、弾の寿命管理や演出待ちに使っている場合、ポーズ中に弾が消える・演出が終わるといった不自然な挙動の原因になります。
この記事では、create_timer() の第2引数 process_alwaysfalse にして、ポーズに追従させる方法を解説します。

環境

  • Godot4.5
  • GDScript

設定方法

公式ドキュメントを読んでみます。

SceneTree
Inherits: MainLoop< Object Manages the game loop via a hierarchy of nodes. Description: As one of the most important cla...

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

タイトルとURLをコピーしました