public override bool StartFindWay(Map map, out WayNode path) { _openList.Clear(); _closeList.Clear(); _map = map; var startNode = map.FindWayData.Entrance; var endNode = map.FindWayData.Destination; _startPos = startNode.Pos; _endPos = endNode.Pos; //起点终点不可达 if (!startNode.Walkable || !endNode.Walkable) { return(base.StartFindWay(map, out path)); } var node = new AStarWayNode(_startPos, new int2(-1, -1)); node.CalcF(map); _openList.Add(node); while (_openList.Count > 0) { //获得F最小的点 var minFNode = GetMinF(); //从列表中移除 _openList.Remove(minFNode); //加入关闭列表 _closeList.Add(minFNode); var surroundPoints = GetSurround(map, minFNode); foreach (var surroundPoint in surroundPoints) { var surround = (AStarWayNode)surroundPoint; //在关闭列表中 丢弃 if (!_closeList.Contains(surround) && !_openList.Contains(surround)) { surround.CalcF(map); surround.Parent = minFNode.Current; if (surround.Current.Equals(map.FindWayData.Destination.Pos)) { path = surround; return(true); } else { _openList.Add(surround); } } } } return(base.StartFindWay(map, out path)); }