我有一个简单的if语句如下:
if (!state.wasGroundedLastFrame && _speed.y > 0){
_newPosition.y += _speed.y * Time.deltaTime;
}
但正如您在下图所示,即使_speed.y
小于0,它也会进入该区块。
我能做错什么?
我在C#中使用MonoDevelop和Unity#
编辑:
为了进一步说明,_speed
是一个私有的Vector3变量。在下面的屏幕截图中,您可以看到在评估条件时和块中的值不会发生变化。在调用此语句之前计算该值。
我刚注意到的另一件奇怪的事情是,当没有用户输入时,这个值应该是常数(-3.33);它代表了角色的当前速度。当我创建断点时,在第一帧中,该值通常介于0和-1之间。但是在所有后续帧中,当我继续执行而不删除断点时,值为-3.33,即“正确”的常量值。
答案 0 :(得分:0)
我可以想到有两件事可能导致这个问题:
您的代码和已编译的版本不同步。不知道如何使用Unity构建MonoDevelop,但我的猜测是它与其他IDE类似。做一个'清洁'和一个“重建所有人”'并重新运行以查看是否遇到同样的问题。
您有多个线程访问和更改_speed.y的值。为了解决这个问题,在整个if语句周围放置一个lock(),如下所示。您还需要对任何更改_speed
private object SpeedLock = new object();
...
lock(SpeedLock){
if (!state.wasGroundedLastFrame && _speed.y > 0){
_newPosition.y += _speed.y * Time.deltaTime;
}
}