protected new static void Init(Dictionary <Node, int> nodesMap) { CostDict.Clear(); RoadDict.Clear(); open_List.Clear(); close_List.Clear(); NodesMap = nodesMap; NodeCount = NodesMap.Count; var enumerator = NodesMap.GetEnumerator(); try { while (enumerator.MoveNext()) { var current = enumerator.Current.Key; CostDict[current] = int.MaxValue; RoadDict[current] = new Queue <Node>(); } } finally { enumerator.Dispose(); } }
/// <summary> /// 获取该地形的通过费用 /// </summary> /// <param name="terrain"></param> /// <returns></returns> public static int GetCost(this Terrain terrain) { if (CostDict.TryGetValue(terrain, out int result) == false) { Debug.LogError($"存在未配置的地形类型:{terrain}"); throw new ArgumentException($"存在未配置的地形类型:{terrain}"); } return(result); }
protected new static void Init(Dictionary <Node, int> nodesMap) { CostDict.Clear(); NodesMap = nodesMap; NodeCount = NodesMap.Count; reachCostLeave = new Dictionary <Node, int>(); canGetMinNodelist = new List <Node>(); var enumerator = NodesMap.GetEnumerator(); try { while (enumerator.MoveNext()) { var current = enumerator.Current.Key; reachCostLeave[current] = -1; } } finally { enumerator.Dispose(); } }
/// <summary> /// 最短経路を探す. /// </summary> /// <returns>The saitan.</returns> /// <param name="nodeMap">Node map.</param> /// <param name="startKey">Start key.</param> /// <param name="goalKey">Goal key.</param> /// <param name="loopout">計算を諦めるしきい値</param> /// <param name="costDict">Cost dict.</param> /// <param name="route">Route.</param> public static int GetShortestRoute(NodeMap nodeMap, string startKey, string goalKey, int loopout, out CostDict costDict, out LinkedList <string> route) { costDict = new CostDict(nodeMap.nodeMap.Count); var stack = new SortedSet <CostDataForStack>(new CostDataForStack.myReverserClass()); var startNode = nodeMap.nodeMap[startKey]; var goalNode = nodeMap.nodeMap[goalKey]; { var openNodeCostData = new CostData { cost = 0.0f, heuristicCost = Vector3.Distance(startNode.Position, goalNode.Position), parent = null }; costDict[startKey] = openNodeCostData; CostDataForStack costDataForStack = new CostDataForStack { cost = openNodeCostData.cost, score = openNodeCostData.cost + openNodeCostData.heuristicCost, nodeName = startKey }; stack.Add(costDataForStack); } while (stack.Count != 0 && 0 < loopout) { loopout--; var parent = stack.First(); stack.Remove(parent); var parentName = parent.nodeName; var parentNode = nodeMap.nodeMap[parentName]; var parentCost = costDict[parentName]; foreach (var openNodeName in parentNode.Graph) { if (costDict.ContainsKey(openNodeName)) { continue; } var openNode = nodeMap.nodeMap[openNodeName]; var openNodeCost = parentCost.cost + Vector3.Distance(openNode.Position, parentNode.Position); var hCost = Vector3.Distance(openNode.Position, goalNode.Position); var openNodeCostData = new CostData { cost = openNodeCost, heuristicCost = hCost, parent = parentName }; var costDataForStack = new CostDataForStack { cost = openNodeCostData.cost, score = openNodeCostData.cost + openNodeCostData.heuristicCost, nodeName = openNodeName }; costDict[openNodeName] = openNodeCostData; stack.Add(costDataForStack); CostDataForStack.Dump(costDataForStack); } if (costDict.ContainsKey(goalKey)) { break; } } if (costDict.ContainsKey(goalKey)) { route = new LinkedList <string>(); var node = costDict[goalKey]; while (node.parent != null) { route.AddFirst(node.parent); node = costDict[node.parent]; } return(route.Count); } else { route = null; return(0); } }
/// <summary> /// 最短経路を探す. /// </summary> /// <returns>The saitan.</returns> /// <param name="nodeMap">Node map.</param> /// <param name="startKey">Start key.</param> /// <param name="goalKey">Goal key.</param> /// <param name="costDict">Cost dict.</param> /// <param name="route">Route.</param> public static int GetShortestRoute(NodeMap nodeMap, string startKey, string goalKey, out CostDict costDict, out LinkedList <string> route) { return(GetShortestRoute(nodeMap, startKey, goalKey, 10000, out costDict, out route)); }