示例#1
0
        public List <AStarNode> CalculateNaivePath(AStarContext context)
        {
            context.ATri = navMesh.SearchTriangleForPoint(context.A);
            context.BTri = navMesh.SearchTriangleForPoint(context.B);

            if (context.ATri == null || context.BTri == null)
            {
                return(null);
            }

            if (!pathCache.ContainsKey(context.ATri))
            {
                pathCache.Add(context.ATri, new Dictionary <NavigationTriangle, List <AStarNode> >());
            }
            if (!pathCache.ContainsKey(context.BTri))
            {
                pathCache.Add(context.BTri, new Dictionary <NavigationTriangle, List <AStarNode> >());
            }

            if (context.ATri == null || context.BTri == null)
            {
                // TODO: Search nearest on NavMesh just make a ray hit to vs all Constrainted edges
                return(null);
            }

            if (context.ATri == context.BTri)
            {
                return(new List <AStarNode>()
                {
                });
            }

            if (pathCache[context.ATri].ContainsKey(context.BTri))
            {
                return(new List <AStarNode>(pathCache[context.ATri][context.BTri]));
            }

            AddTriangleToQueue(context.ATri, null, context);

            while (context.NodeQueue.Count > 0)
            {
                var node = context.NodeQueue.GetNext();

                var triangles = this.navMesh.GetTrianglesWithPoint(node.Position);

                if (triangles.Contains(context.BTri))
                {
                    var path = new List <AStarNode>(BacktrackFinishPath(node, context));
                    return(path);
                }

                foreach (var triangle in triangles)
                {
                    AddTriangleToQueue(triangle, node, context);
                }
            }

            return(null);
        }