예제 #1
0
파일: AStar.cs 프로젝트: dudu502/AiFa
        /// <summary>
        /// 异步坐标点具体实现
        /// </summary>
        /// <param name="map"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="range"></param>
        /// <param name="IsIgnoreCorner"></param>
        /// <param name="OnComplete"></param>
        /// <returns></returns>
        IEnumerator FindPathAsynImpl(AStarMap map, Vector3 start, Vector3 end, float range, bool IsIgnoreCorner, Action <IList <AStarNode> > OnComplete)
        {
            AyncPathData data = new AyncPathData();

            ThreadPool.QueueUserWorkItem((state) =>
            {
                AyncPathData stateData       = state as AyncPathData;
                IList <AStarNode> startNodes = map.GetMapData().GetAStarNodes(start, range);
                IList <AStarNode> endNodes   = map.GetMapData().GetAStarNodes(end, range);
                if (startNodes.Count == 0 || endNodes.Count == 0)
                {
                    stateData.HasPath = false;
                }
                else
                {
                    stateData.Paths = map.GetPath(startNodes[0], endNodes[0], IsIgnoreCorner);
                    if (stateData.Paths == null)
                    {
                        stateData.HasPath = false;
                    }
                }
            }, data);

            while (data.HasPath && data.Paths == null)
            {
                yield return(m_WaitforEndOfFrame);
            }
            if (OnComplete != null)
            {
                OnComplete(data.Paths);
            }
        }
예제 #2
0
파일: AStar.cs 프로젝트: dudu502/AiFa
        /// <summary>
        /// 异步寻路采用线程池管理
        /// </summary>
        /// <param name="map"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="IsIgnoreCorner"></param>
        /// <param name="OnComplete"></param>
        /// <returns></returns>
        IEnumerator FindPathAsynImpl(AStarMap map, AStarNode start, AStarNode end, bool IsIgnoreCorner, Action <IList <AStarNode> > OnComplete)
        {
            AyncPathData data = new AyncPathData();

            ThreadPool.QueueUserWorkItem((state) =>
            {
                AyncPathData stateData = state as AyncPathData;
                stateData.Paths        = map.GetPath(start, end, IsIgnoreCorner);
            }, data);
            while (data.Paths == null)
            {
                yield return(m_WaitforEndOfFrame);
            }
            if (OnComplete != null)
            {
                OnComplete(data.Paths);
            }
        }