来自if语句的意外行为

时间:2015-04-01 21:04:04

标签: c# if-statement unity3d monodevelop

我有一个简单的if语句如下:

if (!state.wasGroundedLastFrame && _speed.y > 0){
    _newPosition.y += _speed.y * Time.deltaTime;
}

但正如您在下图所示,即使_speed.y小于0,它也会进入该区块。enter image description here 我能做错什么?

我在C#中使用MonoDevelop和Unity#

编辑: 为了进一步说明,_speed是一个私有的Vector3变量。在下面的屏幕截图中,您可以看到在评估条件时和块中的值不会发生变化。在调用此语句之前计算该值。Evaluating the condition In the block

我刚注意到的另一件奇怪的事情是,当没有用户输入时,这个值应该是常数(-3.33);它代表了角色的当前速度。当我创建断点时,在第一帧中,该值通常介于0和-1之间。但是在所有后续帧中,当我继续执行而不删除断点时,值为-3.33,即“正确”的常量值。

1 个答案:

答案 0 :(得分:0)

我可以想到有两件事可能导致这个问题:

  1. 您的代码和已编译的版本不同步。不知道如何使用Unity构建MonoDevelop,但我的猜测是它与其他IDE类似。做一个'清洁'和一个“重建所有人”'并重新运行以查看是否遇到同样的问题。

  2. 您有多个线程访问和更改_speed.y的值。为了解决这个问题,在整个if语句周围放置一个lock(),如下所示。您还需要对任何更改_speed

  3. 值的代码设置相同的锁定

    private object SpeedLock = new object();

    ...

    lock(SpeedLock){ if (!state.wasGroundedLastFrame && _speed.y > 0){ _newPosition.y += _speed.y * Time.deltaTime; } }