Это происходит из-за плавающей запятой одинарной точности .
. Вы никогда не должны (должны) сравнивать два float
значения напрямую, поскольку они могут быть логически равными (например, 1 = 5*0.2
), но дляна компьютере они могут отличаться маленьким «эпсилоном»
Так что Unity решает, что Vector3
просто использует только точность 0.00001
для равенства для ==
Вместо этого используйте Mathf.Approximately
, в котором вместо этого используется Epsilon .
Чем проще, чем сравнивать каждый компонент rb.velocity
с0
То, что вы на самом деле хотите, это rb.velocity.magnitude
, которая фактически является общей скоростью.
if (Mathf.Approximately(rb.velocity.magnitude, 0))
Обновление
Либо сохраните последнюю позицию и сравните ее с текущей, используя Vector3.Distance , либо снова с Mathf.Approximately
private Vector3 lastPosition;
private void LateUpdate()
{
if(Mathf.Approximately(Vector3.Distance(lastPosition, transform.position), 0))
{
//...
}
else
{
//...
lastPosition = transform.positiom;
}
}
Или с пользовательским порогом
if(Vector3.Distance(lastPosition, transform.position) <= someThreshold)
или на этот раз вы действительно можете использовать ==
, если порог 0.00001
- это то, что вы хотите
if(lastPosition == transform.position)