此方法如何从 A* 网格中获取节点?

How does this method get a node from a A* grid?

我正在为平台游戏寻找路径。我在 unity3d 中使用 A* 并遵循 this 教程,尽管有一种方法我不明白。

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];
    }

它似乎正在获取该点在网格中位置的百分比值。 但是我想不通。

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.