c# - 此方法如何从 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];
}
它似乎获得了该点在网格中位置的百分比值。但我不知道怎么做。
解决方案
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 中。
推荐阅读
- python - 如何知道python包的特性?
- c - 使用 C 检测 Linux 中拔出的电缆
- php - 无法在 Docker x Wordpress Local 上为 MacOS 10.13.6 定制任何东西
- ruby-on-rails - 如果没有传入强参数,我如何更新当前模型中的参数?
- c# - 我应该如何在 C# 中命名支持属性?
- c# - c#将double转换为字符串问题
- django - 向表单添加了更多字段,但未显示更改
- javascript - 如何根据媒体查询更新样式组件的变量?
- ios - 如何从另一个类重新加载 ViewController?
- javascript - 我如何在 innerHTML 上使用 javascript 和 css 文件