Как этот метод получает узел из сетки A *? - PullRequest
0 голосов
/ 16 мая 2019

Я делаю поиск пути для платформера.Я использую A * в unity3d и следовал этому учебнику, хотя есть один метод, который я не понимаю.

public Node NodeFromWorldPoint(Vector3 worldPosition) {
        float percentX = (worldPosition.x + gridWorldSize.x/2) / gridWorldSize.x;
        float percentY = (worldPosition.z + gridWorldSize.y/2) / gridWorldSize.y;
        percentX = Mathf.Clamp01(percentX);
        percentY = Mathf.Clamp01(percentY);

        int x = Mathf.RoundToInt((gridSizeX-1) * percentX);
        int y = Mathf.RoundToInt((gridSizeY-1) * percentY);
        return grid[x,y];
    }

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

1 Ответ

1 голос
/ 16 мая 2019

float percentX = (worldPosition.x + gridWorldSize.x/2) / gridWorldSize.x;

Сначала мы рассчитываем процент от 0% до 100%, чтобы определить, насколько далеко вы находитесь справа в вашей сетке A *. Я предполагаю, что когда worldPosition равно (0, 0, 0), это означает, что вы находитесь в центре вашей сетки поиска путей. Так что percentX должно быть 0,5 (50%).

Для позиции (0, 0, 0) приведенная выше строка кода приводит к (0 + gridWorldSize.x/2) / gridWorldSize.x, что равно 0,5.

При перемещении влево worldPosition.x становится более отрицательным, поэтому percentX будет уменьшаться в соответствии с приведенной выше формулой. При перемещении вправо worldPosition.x становится более положительным, поэтому percentX будет увеличиваться на основе приведенной выше формулы.

percentX = Mathf.Clamp01(percentX);

Зафиксируйте процент в диапазоне от 0% до 100%

int x = Mathf.RoundToInt((gridSizeX-1) * percentX);

Определите узел A * в зависимости от того, где вы находитесь в сетке. Например, если ваша сетка имеет 10 узлов, и вы находитесь на 30% по всей сетке (percentX == 0,3), то вы находитесь в узле 3.

...