using UnityEngine; namespace Pathfinding { /// /// Restrict suitable nodes by if they have been searched by a FloodPath. /// /// Suitable nodes are in addition to the basic contraints, only the nodes which return true on a FloodPath.HasPathTo (node) call. /// See: Pathfinding.FloodPath /// See: Pathfinding.FloodPathTracer /// public class FloodPathConstraint : NNConstraint { readonly FloodPath path; public FloodPathConstraint (FloodPath path) { if (path == null) { Debug.LogWarning("FloodPathConstraint should not be used with a NULL path"); } this.path = path; } public override bool Suitable (GraphNode node) { return base.Suitable(node) && path.HasPathTo(node); } } /// /// Traces a path created with the Pathfinding.FloodPath. /// /// See Pathfinding.FloodPath for examples on how to use this path type /// /// [Open online documentation to see images] /// public class FloodPathTracer : ABPath { /// Reference to the FloodPath which searched the path originally protected FloodPath flood; protected override bool hasEndPoint { get { return false; } } /// /// Default constructor. /// Do not use this. Instead use the static Construct method which can handle path pooling. /// public FloodPathTracer () {} public static FloodPathTracer Construct (Vector3 start, FloodPath flood, OnPathDelegate callback = null) { var p = PathPool.GetPath(); p.Setup(start, flood, callback); return p; } protected void Setup (Vector3 start, FloodPath flood, OnPathDelegate callback) { this.flood = flood; if (flood == null || flood.PipelineState < PathState.Returned) { throw new System.ArgumentException("You must supply a calculated FloodPath to the 'flood' argument"); } base.Setup(start, flood.originalStartPoint, callback); nnConstraint = new FloodPathConstraint(flood); } protected override void Reset () { base.Reset(); flood = null; } /// /// Initializes the path. /// Traces the path from the start node. /// protected override void Initialize () { if (startNode != null && flood.HasPathTo(startNode)) { Trace(startNode); CompleteState = PathCompleteState.Complete; } else { FailWithError("Could not find valid start node"); } } protected override void CalculateStep (long targetTick) { if (CompleteState != PathCompleteState.Complete) throw new System.Exception("Something went wrong. At this point the path should be completed"); } /// /// Traces the calculated path from the start node to the end. /// This will build an array ( of the nodes this path will pass through and also set the array to the arrays positions. /// This implementation will use the (FloodPath) to trace the path from precalculated data. /// public void Trace (GraphNode from) { GraphNode c = from; int count = 0; while (c != null) { path.Add(c); vectorPath.Add((Vector3)c.position); c = flood.GetParent(c); count++; if (count > 1024) { Debug.LogWarning("Inifinity loop? >1024 node path. Remove this message if you really have that long paths (FloodPathTracer.cs, Trace function)"); break; } } } } }