Вы сравниваете float
значения напрямую ... никогда не делайте этого. Это приводит к проблеме с точностью с плавающей запятой . float
значения фактически сохраняются внутри с шагом Эпсилон .
см. Например с здесь
Ближайший float
к 16.67
является 16.6700000762939453125
Ближайший float
к 100.02
равен 100.01999664306640625
или здесь для расширения борадера.
Используйте Vector3.Distance
!
Желательно с определенным пороговым расстоянием. Есть пример, который выглядит в точности как то, что вы хотите сделать в Coroutines (в JavaScript, но разница с c # в этом случае минимальна)
public float threshold = 0.1f;
//...
if(Vector3.Distance(gameObject.transform.position, array[i]) <= threshold)
{
....
}
Настройте threshold
, чтобы оно имело значение, превышающее то, что объект может перемещать между двумя кадрами.
или вместе с Mathf.Approximately
if(Math.Approximately(Vector3.Distance(object.transform.position, array[i]), 0.0f))
{
....
}
, если ваш порог меньше, чем 0.00001
, чем вы могли бы также использовать
if(object.transform.position == array[i])
{
....
}
, поскольку ==
использует <= 0.00001
для равенства.
Но обратите внимание: В большинстве случаев последние два параметра также потерпят неудачу, потому что опции для движущегося GameObject, чтобы соответствовать точному 3D-положению, почти равны 0, если вы не установили фиксированные значения где-либо.
Vector3.Distance
также работает с Vector2
в качестве параметра, поскольку существует неявное приведение типа к Vector3
.