Пример #1
0
 /// <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);
 }
Пример #2
0
            public void Remove(NavigatePointArgs args)
            {
                var list = this.navigatePointList[args.Cost];

                list.Remove(args);
                if (list.Any() == false)
                {
                    this.navigatePointList.Remove(args.Cost);
                }
            }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }