2015-04-01 3 views
1

У меня есть простой, если заявление следующим образом:Неожиданное поведение от того, если оператор

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

Но как вы можете видеть на изображении ниже, что он входе в блок, даже если _speed.y меньше 0. enter image description here Что может Я ошибаюсь?

Я с использованием MonoDevelop с Unity в C#

EDIT: Для дальнейшего уточнения, _speed является частной переменной Vector3. На скриншотах ниже вы можете видеть, что значение не изменяется во время оценки состояния и в блоке. Значение вычисляется до вызова этого оператора. Evaluating the conditionIn the block

Еще одна странная вещь, которую я только заметил, заключается в том, что при отсутствии пользовательского ввода это значение должно быть постоянным (-3.33); он представляет текущую скорость персонажа. Когда я создаю точку останова, в первом кадре значение обычно находится между 0 и -1. Однако во всех последующих кадрах, когда я продолжаю выполнение без удаления точки останова, значение равно -3.33, «правильное» постоянное значение.

+0

Просьба * * полный воспроизводимый пример проблема. – Servy

+5

Доступен ли _speed.y несколькими потоками? – Kimi

+0

Что такое Datatype для y – user2526236

ответ

0

Есть 2 вещи, которые я могу думать о том, что может быть причиной этой проблемы:

  1. Ваш код и скомпилированные версии не синхронизированы. Не уверен, как построить MonoDevelop с Unity, но я предполагаю, что он похож на другие IDE. Так что сделайте «Очистить» и «Восстановить все» и снова запустите, чтобы увидеть, сталкиваетесь ли вы с той же проблемой.

  2. У вас есть несколько потоков, доступных и изменяющих значение для _speed.y. Чтобы решить эту проблему, поместите lock() вокруг всего оператора if, как показано ниже. Вам также необходимо поставить ту же блокировку вокруг какой-либо код, который изменяет значение _speed

private object SpeedLock = new object();

...

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