[Godot] 一時スリープ(ウェイト)を実装する!1行で書けます

Godot公式サイトへのボタン
完全無料の高機能ゲームエンジン「Godot」の解説を書いています。
公式サイトはこちら公式ドキュメント(Godot 4)公式ドキュメント(Godot 3)当サイトのGodot記事一覧はこちら

今日はGodotで一時的なスリープ(ウェイト)を実装する方法を探ります。

いくつかの方法がありますが、最も簡単なのはcreate_timerを使う方法です。

このページで紹介しているyieldを使った処理待ちは、4.0で廃止になりました。4.0からは「await」を使用します。構文をコメントいただきましたので最下部に追加しました。

記事中の商品/サービス

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

コメント

  1. 通りすがりのGODOT初心者 より:

    一応awaitの書き方、まこれは公式のチュートリアルに載ってますけど
    await get_tree().create_timer(1.0).timeout

  2. 太田アベル より:

    通りすがりのGODOT初心者さん > コメントありがとうございました!本文にも追加しました。