完全無料の高機能ゲームエンジン「Godot」の解説を書いています。
公式サイトはこちら / 公式ドキュメント(Godot 4) / 公式ドキュメント(Godot 3) / 当サイトのGodot記事一覧はこちら
公式サイトはこちら / 公式ドキュメント(Godot 4) / 公式ドキュメント(Godot 3) / 当サイトのGodot記事一覧はこちら
今日はGodotで一時的なスリープ(ウェイト)を実装する方法を探ります。
いくつかの方法がありますが、最も簡単なのはcreate_timerを使う方法です。
create_time で実装
Godotのシーンが持つメインタイマー(スレッド)に、create_timer
関数があります。これを使うと、必要な箇所にワンライナーで書くことができ、一番簡単です。
yield(get_tree().create_timer(1.0), "timeout")
get_tree().create_timer()
は、指定時間が経過すると、Timerと同じように timeout シグナルを発生します。シグナルの発生をyieldで待ち受けます。
上記の例は1秒間ぴったり止まります。
Timerでの実装
Timerノードで実装することも可能です。
ただしTimerでの実装は、Timerの生成と廃棄が必ず必要になり、多数のノードで実行するとオーバーヘッドもかなりのものになります。
かといって1つのタイマーを多数のオブジェクトで共有というのも、非常にめんどうでまともな制御はできそうもありません。
自分の配下の一部ノードだけスリープしたいなど、特殊な状況のみに使うテクニックになると思います。
var t = Timer.new()
t.set_wait_time(time_sec)
t.set_one_shot(true)
self.add_child(t)
t.start()
yield(t, "timeout")
t.queue_free() #必ず廃棄/* Your code... */
この一連のタイマー処理を1つの関数にしたいと考えるかもしれませんが、Godotの場合funcは並行処理されてしまうため、一瞬で終了(通り過ぎて)してしまいます。
通り過ぎたあと、Timerの処理だけが発生します。つまりシーンのスレッドはまったく止まらないわけです。そのため、必ずコードの途中にそのまま必要があります。
行数も多いしオーバーヘッドも多いので、通常はget_tree().create_timer()のほうがいいでしょう。
4.0での書き方
4.0用の書き方を通りすがりのGODOT初心者さんからコメントいただきました!参考にしてください。
await get_tree().create_timer(1.0).timeout
コメント
一応awaitの書き方、まこれは公式のチュートリアルに載ってますけど
await get_tree().create_timer(1.0).timeout
通りすがりのGODOT初心者さん > コメントありがとうございました!本文にも追加しました。