Godot yield()
イールド みたいな読み
要するに、関数の途中で処理を中断する。
再開することもできる。
ビルトイン関数の一つ
途中で関数をやめて、その時点のfrozen状態を戻り値として返す。
return : GDScriptFunctionsState オブジェクト
引数 : (Object object, String signal
resume()
GDScriptFunctionsState.resume()
yield()で中断したところから関数を再開する。
resumeに引数を渡すこともできる
yield = 明け渡す、譲渡する
resume = 続行する
yieldとシグナルの組み合わせ
実際のところは、signalと接続されて呼び出されるコルーチン関数と
組み合わせることで効果を発揮する。
yieldの引数にはObjectとsignalが渡せる。
渡したObject で 渡したSignalが発生すると
yield()を実行したところから再開する。
code: py
# Resume execution the next frame.
yield(get_tree(), "idle_frame")
SceneTreeが1frame待機したら、戻ってくる。
再開するときは、yieldを呼び出した時点のTreeのfrozen状態が復元される。
シグナルなどで呼び出した関数の中から、Physicsオブジェクトのプロパティを
操作したりすると、Physicsプロセスが間に挟まるせいで想定道理にならない。
(is_on_floor()やtransform.positionなど)
これを使うと、次の1frame分のprocessをなかったコトにして処理を挟むことができる。
code: py
func hurt():
position.y -= 10
yield(get_tree(), "idle_frame") # 間に物理プロセスが挟まっても、保存した状態に戻って再開できる
motion.y = -(JUMP_SPEED)
lives -= 1
if lives <= 0:
end_game()
他にも
code: py
# Resume execution when animation is done playing.
yield(get_node("AnimationPlayer"), "animation_finished")
# Wait 5 seconds, then resume execution.
yield(get_tree().create_timer(5.0), "timeout")
主に、Godotで発生するイベント(signal)に対する非同期のコールバックを仕込むのに便利