有没有办法等待 if 语句为真?

问题描述 投票:0回答:1

我正在尝试制作一款多人Godot游戏,我想确保每个@rpc都已被所有同行阅读,然后再继续阅读代码的主要部分。

所以我创建了一个变量,每次读取其中一个 rpc 时该变量都会增加。

问题是我想确保当这个变量低于玩家数量时主程序停止。

我一直在寻找很多文档,但我只遇到了await,它使用信号(因此没有指向变量的链接),while(它完全冻结了程序),并且一直在尝试找到启动的函数任何时候 if 语句为真(没有运气)。

预先感谢您对我的困难的帮助和考虑。

function if-statement rpc multiplayer godot4
1个回答
0
投票

不,没有。你需要构建这个。

正如您发现的那样,

await
适用于信号。那么,您可以创建自己的自定义信号。因此,在递增变量的代码中,您可以添加检查,或发出信号,或两者兼而有之。


例如,一种方法是为变量定义一个 setter,并在变量更改为您想要的值时发出信号。然后您连接或等待它。

signal expected_x_reached()

var expected_x:int

var x:int:
    set(mod_value):
        if x == mod_value:
            return

        x = mod_value
        if mod_value == expected_x:
            expected_x_reached.emit()

请注意,您可以定义值更改时的信号,并连接匿名方法来检查该值(如果代码的不同部分需要等待不同的值,这很有用):

signal x_changed(value:int)

var x:int:
    set(mod_value):
        if x == mod_value:
            return

        x = mod_value
        x_changed.emit(mod_value)

在这种情况下连接的方法将获取值:

obj.x_changed.connect(
    func (value:int) -> void:
        if value == expected_x:
            # do something, emit a signal, whatever
            pass
)

如果不是您控制的代码...您可能必须找到足够的现有信号。

最糟糕的情况是,您需要检查每一帧,例如使用

_process
或连接到场景树的
process_frame
信号。

func _process(_delta:float) -> void:
    if obj.x == expected_x:
        # do something, emit a signal, whatever
        pass

您可以在现有节点中执行此操作,或者创建一个新节点来跟踪变量并发出信号...其他节点可以连接到哪些节点。


如果您正在编写一个循环来等待,您应该能够:

  • 将其转换为在
    _process
    中运行的代码(每帧进行一次迭代)。
  • await
    或某些自定义信号上使用
    process_frame
    ※。
  • 或者用
    call_deferred
    打破它。 我建议不要滥用此功能,您可以进行的延迟通话数量是有限的。

※:我还要指出等待有一个缺点:它无法取消,并且释放的对象无法从等待中恢复(这可能会导致一些讨厌的错误)。如果遇到此类问题,请考虑从

await
重构为使用
CONNECT_ONE_SHOT
连接到信号的延续,或者在适当时使用代码断开连接。原因是当对象被释放时,它们会自动断开连接。

© www.soinside.com 2019 - 2024. All rights reserved.