コード例 #1
0
ファイル: BaseAStarMgr.cs プロジェクト: chengyimingvb/CYMUni
 public GraphNodeRange(GraphNodeRange parent, GraphNode node)
 {
     Parent = parent;
     Node   = node;
     if (Parent != null)
     {
         Depth    = Parent.Depth + 1;
         Distance = Parent.Distance + Vector3.Distance((Vector3)Node.position, (Vector3)Parent.Node.position);
     }
 }
コード例 #2
0
ファイル: BaseAStarMgr.cs プロジェクト: chengyimingvb/CYMUni
        public HashList <GraphNode> GetDistanceRange(Vector3 pos, float distance, Func <GraphNode, bool> filter = null)
        {
            BFSQueue.Clear();
            BFSResult.Clear();
            BFSRange.Clear();
            var       depth = distance / NodeSize;
            GraphNode seed  = GetNode(pos);
            Action <GraphNodeRange, GraphNode> callback = (parent, node) =>
            {
                if (node.Walkable && !BFSResult.Contains(node))
                {
                    if (filter != null && !filter(node))
                    {
                        return;
                    }
                    var nRangeItem = new GraphNodeRange(parent, node);
                    if (nRangeItem.Distance > distance)
                    {
                        return;
                    }
                    if (nRangeItem.Depth > depth)
                    {
                        return;
                    }

                    BFSResult.Add(node);
                    BFSQueue.Enqueue(node);
                    BFSRange.Add(node, nRangeItem);
                }
            };

            callback(null, seed);

            while (BFSQueue.Count > 0)
            {
                GraphNode      n          = BFSQueue.Dequeue();
                GraphNodeRange nRangeItem = BFSRange[n];
                if (nRangeItem.Distance > distance)
                {
                    break;
                }
                if (nRangeItem.Depth > depth)
                {
                    break;
                }
                n.GetConnections((x) =>
                {
                    callback(nRangeItem, x);
                });
            }
            return(BFSResult);
        }