You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:22:49