/// <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); } }
/// <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); } }
/// <summary> /// 同步寻路 /// </summary> /// <param name="map"></param> /// <param name="start"></param> /// <param name="end"></param> /// <param name="IsIgnoreCorner"></param> /// <returns></returns> public IList <AStarNode> FindPathSync(AStarMap map, AStarNode start, AStarNode end, bool IsIgnoreCorner) { return(map.GetPath(start, end, IsIgnoreCorner)); }