/// <summary> /// 添加 /// </summary> /// <param name="args"></param> internal void Add(NavigatePointArgs args) { if (this.navigatePointList.ContainsKey(args.Cost) == false) { this.navigatePointList.Add(args.Cost, new List <NavigatePointArgs>()); } this.navigatePointList[args.Cost].Add(args); }
public void Remove(NavigatePointArgs args) { var list = this.navigatePointList[args.Cost]; list.Remove(args); if (list.Any() == false) { this.navigatePointList.Remove(args.Cost); } }
/// <summary> /// 获取最短路径 /// </summary> /// <param name="map">游戏地图</param> /// <param name="start">起始点</param> /// <param name="end">终点</param> /// <param name="passabilityArgs">角色通过性参数</param> /// <returns>路径数组</returns> public List <Vector2Int> GetPath(GameMap map, Vector2Int start, Vector2Int end, RolePassabilityArgs passabilityArgs) { IComparer <NavigatePointArgs> NavigatePointArgsComparer = new NavigatePointArgs(); var openSet = new NavigatePointList(); var closeSet = new HashSet <Vector2Int>(); var result = new List <Vector2Int>(); var navigateCount = 0; // 寻路使用次数计数器 var navigateStartTime = DateTime.Now; // // 寻路用时计时器 openSet.Add(new NavigatePointArgs() { ActualCost = 0, ExpectCoset = 0, Position = start, Parent = null, }); while (openSet.IsEmpty()) { navigateCount++; var point = openSet.Min; openSet.Remove(point); if (point.Position != end) { closeSet.Add(point.Position); List <NavigatePointArgs> neighbors = map[point.Position.x, point.Position.y] .neighbors .Where(x => x != null && closeSet.Contains(x.Value) == false) .Select(x => { var args = this.GetNavigatePointArgs(map, point.ActualCost, x.Value, end, passabilityArgs); args.Parent = point; return(args); }).ToList(); openSet.AddRang(neighbors); } else { result = this.GetPath(point); break; } } var navigateTime = DateTime.Now - navigateStartTime; Debug.Log($"寻路完成!\n路径{string.Join("=>", result)}\n" + $"共计遍历{navigateCount}次,总耗时{navigateTime.TotalMilliseconds}ms"); return(result); }
/// <summary> /// 获取最终路径 /// </summary> /// <param name="point"></param> /// <returns></returns> private List <Vector2Int> GetPath(NavigatePointArgs point) { List <Vector2Int> result = new List <Vector2Int>(); var next = point; while (next.Parent != null) { result.Add(next.Position); next = next.Parent; } //if (result.Count > 0) //{ // result.RemoveAt(result.Count - 1); //} return(result); }