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

Godot公式サイトへのボタン
完全無料の高機能ゲームエンジン「Godot」の解説を書いています。
公式サイトはこちら公式ドキュメントはこちら当サイトの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() #必ず廃棄

 

この一連のタイマー処理を1つの関数にしたいと考えるかもしれませんが、Godotの場合funcは並行処理されてしまうため、一瞬で終了(通り過ぎて)してしまいます。

通り過ぎたあと、Timerの処理だけが発生します。つまりシーンのスレッドはまったく止まらないわけです。そのため、必ずコードの途中にそのまま必要があります。

行数も多いしオーバーヘッドも多いので、通常はget_tree().create_timer()のほうがいいでしょう。

コメント