基于六边形网格和移动成本的路径查找
ProjectTB 中坐标、地形和移动范围的分离
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
六边形网格不能像正方形一样只检查上、下、左、右四个方向。 在TB项目中FTBHexCoord用作键,GridManager 计算邻居和移动成本。
UPROPERTY(BlueprintReadOnly, Category = "Grid")
TMap<FTBHexCoord, TObjectPtr<ATBHexTile>> Tiles;
单独的坐标和世界位置
游戏规则使用十六进制坐标计算,屏幕布局为HexToWorld()转换自
FTBHexCoord
邻居搜索/范围/路线导航
↓ HexToWorld
FVector
演员的实际位置
这样,即使图块间距或网格尺寸发生变化,也无需重新创建路径搜索规则。
移动范围不仅仅限于距离。
平原土地成本为1,沼泽成本为2,并且可能存在无法到达的瓷砖。 如果只是显示3个空格的半径,就会与实际的移动范围有所不同。
ProjectTB 的 GridManager 计算从起点开始的累积移动成本。
bool FindPath(
ATBHexTile* StartTile,
ATBHexTile* DestinationTile,
TArray<ATBHexTile*>& OutPath,
int32& OutCost
) const;
TArray<ATBHexTile*> GetReachableTiles(
ATBHexTile* StartTile,
int32 MovementBudget
) const;
这个结构类似于 Dijkstra 搜索。 它从迄今为止成本最低的图块开始扩展,如果找到更便宜的路线,则更新成本和先前的坐标。
实现六边形网格的重要之处不是绘制六边形网格。 将逻辑坐标、世界位置、地形成本和占用状态分离到不同的职责中,可以随着移动规则的增长而更容易生存。