如何在Godot中用GDScript实现类似Unity C#的可终止自定义Update协程?
实现与Unity协程等价的Godot GDScript逻辑
需要编写一段GDScript代码,实现和以下Unity C#协程完全等价的功能:可以随时启动一个持续运行的逻辑(类似DIY_Update),并能通过一个布尔值随时终止该进程。当前自行编写的代码会阻塞主线程,不符合需求。
Unity C# 参考代码
void Start() { StartCoroutine(DIY_Update()); } IEnumerator DIY_Update() { while (true) { if(randomBoolean) { break; } yield return null; } }
问题代码(会阻塞主线程)
当前编写的GDScript因使用await等待协程完成,导致主线程阻塞:
extends Node func _ready(): await(DIY_Update()) func DIY_Update(): while true: if random_boolean(): break await(null)
解决方案
问题核心在于_ready()中的await(DIY_Update())——await会强制当前线程等待协程执行完毕,造成阻塞。在Godot中,要实现Unity协程的后台运行效果,直接调用异步函数即可,无需用await等待。
同时,原Unity代码使用布尔变量控制终止,而非随机函数,因此我们需要将终止条件改为成员变量,方便随时修改来终止协程。
正确实现代码
extends Node # 控制协程终止的布尔变量,可外部修改 var should_stop = false func _ready(): # 直接调用异步函数,后台运行不阻塞主线程 DIY_Update() func DIY_Update(): while true: # 检查终止条件,满足则退出循环 if should_stop: break # 等待下一帧,等价于Unity中的yield return null await get_tree().process_frame # 可选:协程终止后的清理逻辑 print("DIY_Update 已终止")
使用说明
- 启动协程:在任意需要的地方直接调用
DIY_Update()即可(比如_ready()、按钮点击事件等) - 终止协程:只需设置
should_stop = true,协程会在下一帧检查到条件后退出循环
内容的提问来源于stack exchange,提问作者semih yılmaz
相关产品推荐
相关产品推荐

