Лучший способ определения дистанции

Всем доброго времени суток! Делаю игру для телефона и возник вопрос с определением дистанции от множества объектов до игрока. Т.е. у меня на сцене есть много объектов и один игрок, нужно выполнить действие при приближении игрока на определенную дистанцию.

Не накладна ли будет подобная проверка float distance = (player.position - transform.position).sqrMagnitude на каждом из объектов раз в 0.5 секунд?

Или лучше дать объектам Circle Collider2D и проверять через OnTriggerEnter2d()

А если объектов много, примерно 50, то какой способ лучше? Или может вы знаете другие способы?


Ответы (1 шт):

Автор решения: Yaroslav

Длина вектора вычисляется так: √(x²+y²+z²) или sqrt(x*x+y*y+z*z). Работает для 3d, 2d, 1d, 100d... Самая тяжелая операция это вычисление квадратного корня.

Для вычисления длины вектора используется свойство pointA.magnitude или Vector3.Distance(pointA, pointB), это одни и те же вычисления.

Но что бы сравнить длины, вычислять квадратный корень не имеет смысла, можно сравнить сами квадраты, результат будет тот-же. Для этого есть свойство pointA.sqrMagnitude (x*x+y*y+z*z).

if (pointA.sqrMagnitude < pointB.sqrMagnitude)
...
float sqrTriggerDistance = triggerDistance*triggerDistance;
if (pointA.sqrMagnitude < sqrTriggerDistance)

Эта операция не особо затратная, два притопа, три умножить, вычисляй хоть тысячу раз каждый кадр.

На дополнительных проверках типа, если длина длиньше самой длинной оси то в этом нет смысла

if (Mathf.Max(pointA.x, Mathf.Max(pointA.y, pointA.z)) < triggerDistance &&
    pointA.sqrMagnitude < sqrTriggerDistance)

можешь больше потерять, но это нужно тестить с stopwatch.

→ Ссылка