首页 > 解决方案 > 此方法如何从 A* 网格中获取节点?

问题描述

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

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

它似乎获得了该点在网格中位置的百分比值。但我不知道怎么做。

标签: c#unity3dpath-finding

解决方案


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 中。


推荐阅读