/// <summary> /// 路径搜寻 /// </summary> /// <returns></returns> private bool Search() { if (_endNode.moveable == false) { return(false); } HexNode node = _startNode; node.version = _currentVersion; float g; float h; float f; while (node != _endNode) { for (int i = 0; i < 6; i++) { HexNode testNode = _grid.GetNode(node.hex.GetNeighbor(i)); if (testNode == null || testNode.moveable == false) { continue; } g = node.g + 1; h = _heuristic(testNode, _endNode); f = g + h; if (testNode.version == _currentVersion) { if (testNode.f > f) { testNode.f = f; testNode.g = g; testNode.h = h; testNode.parent = node; } } else { testNode.f = f; testNode.g = g; testNode.h = h; testNode.parent = node; testNode.version = _currentVersion; _open.Insert(testNode); } } if (_open.isEmpty) { return(false); } node = _open.Pop(); } BuildPath(); return(true); }
/// <summary> /// 创建路径 /// </summary> private void BuildPath() { HexNode node = _endNode; _path.Clear(); _path.Add(node); while (node != _startNode) { node = node.parent; _path.Insert(0, node); } }
/// <summary> /// 寻路 /// </summary> /// <param name="start"></param> /// <param name="end"></param> /// <returns></returns> public List <HexNode> Find(Hex start, Hex end) { _grid.SetStartNode(start); _grid.SetEndNode(end); _startNode = _grid.startNode; _endNode = _grid.endNode; if (_startNode == null || _endNode == null || !_endNode.moveable) { return(null); } if (FindPath()) { return(_path); } return(null); }
/// <summary> /// 几何估价法(Euclidian heuristic) /// 计算出两点之间的直线距离,本质公式为勾股定理A²+B²=C²。 /// </summary> /// <param name="startNode"></param> /// <param name="endNode"></param> /// <returns></returns> public static float Euclidian(HexNode startNode, HexNode endNode) { return(endNode.hex.GetDistance(startNode.hex)); }
/// <summary> /// 节点对比 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> private bool NodeComparison(HexNode x, HexNode y) { return(x.f < y.f); }
/// <summary> /// 销毁对象池对象 /// </summary> public void OnPoolDispose() { parent = null; }
/// <summary> /// 设置起始节点 /// </summary> /// <param name="node"></param> public void SetStartNode(HexNode node) { _startNode = node; }
/// <summary> /// 重置对象池对象 /// </summary> public void OnPoolReset() { parent = null; }
/// <summary> /// 添加节点 /// </summary> /// <param name="hex"></param> /// <param name="moveable"></param> public void AddNode(Hex hex, bool moveable) { _nodes[hex] = new HexNode(hex, moveable); }
/// <summary> /// /// </summary> public void Clear() { _startNode = null; _endNode = null; _nodes.Clear(); }
/// <summary> /// 设置结束节点 /// </summary> /// <param name="hex"></param> public void SetEndNode(Hex hex) { _endNode = GetNode(hex); }
/// <summary> /// 设置结束节点 /// </summary> /// <param name="node"></param> public void SetEndNode(HexNode node) { _endNode = node; }
/// <summary> /// 设置起始节点 /// </summary> /// <param name="hex"></param> public void SetStartNode(Hex hex) { _startNode = GetNode(hex); }