【Godot_4.2.2】关于await

关键词: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 可以让你的代码更加简洁和易读,尤其是在需要处理延迟或等待事件的情况下。它允许你以非阻塞的方式进行异步编程,使得游戏逻辑能够顺畅运行而不会冻结主线程。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
godot中的`class_name`关键字用于为类注册一个新的类型,并在编辑器中显示自定义图标。使用`class_name`关键字时,可以指定可选的图标路径,以使其在编辑器中显示。 以下是一个示例: ```gd # Item.gd extends Node class_name Item, "res://interface/icons/item.png" ``` 这个示例中,`Item.gd`文件中的类被注册为一个新的类型,并且使用`"res://interface/icons/item.png"`作为它在编辑器中的图标。 另外,godot中的类文件可以包含内部类。内部类使用`class`关键字来定义,并可以使用`ClassName.new()`函数来实例化。 以下是一个示例: ```gd # Inside a class file. # An inner class in this class file. class SomeInnerClass: var a = 5 func print_value_of_a(): print(a) # This is the constructor of the class file's main class. func _init(): var c = SomeInnerClass.new() c.print_value_of_a() ``` 在这个示例中,主类文件中包含了一个内部类`SomeInnerClass`,可以通过`SomeInnerClass.new()`来实例化并调用它的方法。 此外,以文件形式存储的类在godot中被视为资源。要在其他类中访问这些类资源,必须从磁盘加载它们。可以使用`load`函数或`preload`函数来加载类资源。 以下是一个示例: ```gd # Load the class resource when calling load(). var my_class = load("myclass.gd") # Preload the class only once at compile time. const MyClass = preload("myclass.gd") func _init(): var a = MyClass.new() a.some_function() ``` 在这个示例中,使用`load`函数来加载一个类资源,并使用`preload`函数在编译时预加载一个类资源。然后可以通过调用类对象上的`new`函数来实例化该类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值