队列内容的不同取决于我从哪里访问它

  • 本文关键字:访问 取决于 队列 c# godot
  • 更新时间 :
  • 英文 :


我目前正在使用Godot引擎4.0.1编写一款游戏,现在是时候执行攻击,伤害和击退了。

要将knockback应用于播放器,我已经创建了以下方法:

public void HandleOutsideForce(Godot.Vector3 force, bool enableRagdoll)
{
AppliedForces.Enqueue(force / Mass);
}

因为我不能在PhysicsProcess函数之外编辑速度,并且因为这个函数在玩家与hitbox碰撞时被调用,所以我将施加的力放在队列中,在物理帧期间清空队列,如下所示:

public override void _PhysicsProcess(double delta)
{
base._PhysicsProcess(delta);
ControlMethod.PhysicsProcess(delta); //You can disregard this part

while (AppliedForces.Count > 0)
Velocity += AppliedForces.Dequeue();
}

然而,经过一些测试,我注意到它不起作用,只要我尝试从PhysicsProcess函数访问队列,它是空的,而当我从第一个函数访问它时,它通常会填满。

有人知道为什么会发生这种情况吗?提前感谢

由于代码是作为物理分辨率(碰撞)的一部分运行的,因此它不能修改某些物理属性(在本例中为velocity),并且Godot会告诉您使用延迟操作(即call_deferredset_deferred)。

将您引向一个解决方案:从冲突中使用CallDeferred调用将修改velocity的方法。延迟的调用将发生在帧之间,并且在物理进程之外。然后你就可以正常修改velocity了。

我建议使用CallDeferred而不是SetDeferred的正确性。我不期望SetDeferred引起ABA问题,但我宁愿确定。


另一个想法(我在评论中建议的)是有一个矢量来累积你将在_PhysicsProcess中应用的速度变化。


我不确定为什么队列会引起问题。我猜这是。net集合特性和Godot内部线程的结合。无论如何,希望你能解决这个问题。

事实证明,我不知道为什么这样做,没有合理的解决方案(如CallDeferred,或SetDeferred)已经工作,但我确实通过逐行重写文件来修复它,并每次测试,期望找到罪魁祸首。

脚本中没有任何更改,但它现在可以工作了。美妙的

最新更新