/// <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="range"></param> /// <param name="IsIgnoreCorner"></param> /// <returns></returns> public IList <AStarNode> FindPathSync(AStarMap map, Vector3 start, Vector3 end, float range, bool IsIgnoreCorner) { IList <AStarNode> startNodes = map.GetMapData().GetAStarNodes(start, range); IList <AStarNode> endNodes = map.GetMapData().GetAStarNodes(end, range); if (startNodes.Count == 0 || endNodes.Count == 0) { return(null); } return(FindPathSync(map, startNodes[0], endNodes[0], IsIgnoreCorner)); }
/// <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); } }
public int extend2; // for extension public PathFindingRequest(Int3 from, Int3 to, AStarMap map, AStarPathPlanner planner, int ex1 = 0, int ex2 = 0) { fromPosition = from; toPosition = to; INavGraph graph = map as INavGraph; AStarNode fromNode = graph.GetNodeAt(to); AStarNode toNode = graph.GetNodeAt(from); if (fromNode == null) { UnityEngine.Debug.LogError("PathFindingRequest: fromNode is null."); } if (toNode == null) { UnityEngine.Debug.LogError("PathFindingRequest: toNode is null."); } SetData(fromNode, toNode, map, planner); extend1 = ex1; extend2 = ex2; }
/// <summary> /// 异步寻路 /// </summary> /// <param name="map"></param> /// <param name="start"></param> /// <param name="end"></param> /// <param name="IsIgnoreCorner"></param> /// <param name="OnComplete"></param> public void FindPathAsyn(AStarMap map, AStarNode start, AStarNode end, bool IsIgnoreCorner, Action <IList <AStarNode> > OnComplete) { StartCoroutine(FindPathAsynImpl(map, start, end, IsIgnoreCorner, OnComplete)); }
/// <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)); }
/// <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> public void FindPathAsyn(AStarMap map, Vector3 start, Vector3 end, float range, bool IsIgnoreCorner, Action <IList <AStarNode> > OnComplete) { StartCoroutine(FindPathAsynImpl(map, start, end, range, IsIgnoreCorner, OnComplete)); }