关键词:Godot,4.2.2,await
前言:本内容由ChatGPT回答后,经楼主整理所得,仅用于笔记。可随意转载,无需授权



在 Godot 4.x 中,await 是一个关键字,用于处理异步操作。它允许你在异步函数中等待某个事件、信号或条件的完成,而不会阻塞主线程。这使得编写非阻塞、响应迅速的游戏逻辑变得更加直观。

基本用法

1. 使用 await 等待一个信号

你可以使用 await 来等待一个信号,例如按钮被按下:

extends Node

func _ready():
    var button = $Button
    button.pressed.connect(_on_button_pressed)
    print("等待按钮按下...")

    await button.pressed  # 等待按钮被按下
    print("按钮已按下!")

func _on_button_pressed():
    print("信号已接收!")

在这个示例中,当代码执行到 await button.pressed 时,它会暂停,直到按钮被按下为止。

2. 使用 await 等待一个异步过程

你可以创建一个异步函数,使用 await 来等待其返回结果。例如,模拟从服务器加载数据:

extends Node

func _ready():
    print("开始加载数据...")
    await load_data()  # 等待数据加载完成
    print("数据加载完成!")

async func load_data() -> void:
    var timer = get_tree().create_timer(2)  # 创建一个计时器
    await timer.timeout  # 等待计时器超时
    print("数据加载成功!")

在这个例子中,load_data 函数会先创建一个计时器并等待它超时,然后继续执行。

3.返回值

异步函数可以返回值,使用 await 调用时,可以直接获取该值:

func _ready():
    var result = await compute_value()
    print("计算结果: ", result)

async func compute_value() -> int:
    await get_tree().create_timer(1).timeout  # 等待1return 42  # 返回计算结果

小结

async 关键字:所有使用 await 的函数必须标记为 async。
await:用于等待信号、超时或其他异步操作的完成。



另外,在 Godot 中使用 await get_tree().create_timer(1.0).timeout 是一种非常常见的用法,它用于创建一个计时器并等待其超时信号。这种方式使得异步编程变得直观,因为你可以暂停代码执行,直到等待的事件发生。

解释

get_tree():获取当前场景树的引用。

create_timer(1.0):创建一个新的计时器,设定为 1 秒后超时。

.timeout:这是计时器发出的信号,当计时器结束时会发出此信号。

await:暂停当前函数的执行,直到信号被发出。

示例用法

下面是一个简单的示例,演示如何使用这一行代码来实现一个倒计时功能:

extends Node

func _ready():
    print("开始等待 1 秒...")
    await get_tree().create_timer(1.0).timeout
    print("1 秒已到!")

更加详尽的应用示例

假设我们想要在游戏中实现一个延迟操作,比如在特定条件下等待几秒钟再执行某个功能。

extends Node

func _ready():
    print("准备开始任务...")
    await wait_for_seconds(3.0)  # 等待 3print("任务完成!")

# 创建一个可重用的等待函数
async func wait_for_seconds(seconds: float) -> void:
    await get_tree().create_timer(seconds).timeout

小结

使用 await get_tree().create_timer(1.0).timeout 可以让你的代码更加简洁和易读,尤其是在需要处理延迟或等待事件的情况下。它允许你以非阻塞的方式进行异步编程,使得游戏逻辑能够顺畅运行而不会冻结主线程。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐