我正在尝试制作一款多人Godot游戏,我想确保每个@rpc都已被所有同行阅读,然后再继续阅读代码的主要部分。
所以我创建了一个变量,每次读取其中一个 rpc 时该变量都会增加。
问题是我想确保当这个变量低于玩家数量时主程序停止。
我一直在寻找很多文档,但我只遇到了await,它使用信号(因此没有指向变量的链接),while(它完全冻结了程序),并且一直在尝试找到启动的函数任何时候 if 语句为真(没有运气)。
预先感谢您对我的困难的帮助和考虑。
不,没有。你需要构建这个。
正如您发现的那样,
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
连接到信号的延续,或者在适当时使用代码断开连接。原因是当对象被释放时,它们会自动断开连接。