проверка положения между объектом и точкой. Unity3D - PullRequest
1 голос
/ 14 марта 2019
    if (((float) (Math.Round(gameObject.transform.position.x, 1))) == ((float) (Math.Round(array[i].x, 1))) && (((float) (Math.Round(gameObject.transform.position.y, 1))) ==  (float) (Math.Round(array[i].y, 1))))

Привет!Я использую C #, и массив заполнен векторными позициями.Я пытаюсь увидеть, когда объект попадает в определенную позицию.Это никогда не срабатывает.У вас есть другие советы, как это сделать?

1 Ответ

2 голосов
/ 14 марта 2019

Вы сравниваете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...