using UnityEngine; namespace Pathfinding { /// /// Blocks single nodes in a graph. /// /// This is useful in turn based games where you want /// units to avoid all other units while pathfinding /// but not be blocked by itself. /// /// Note: This cannot be used together with any movement script /// as the nodes are not blocked in the normal way. /// See: TurnBasedAI for example usage /// /// See: BlockManager /// See: turnbased (view in online documentation for working links) /// [HelpURL("http://arongranberg.com/astar/docs/class_pathfinding_1_1_single_node_blocker.php")] public class SingleNodeBlocker : VersionedMonoBehaviour { public GraphNode lastBlocked { get; private set; } public BlockManager manager; /// /// Block node closest to the position of this object. /// /// Will unblock the last node that was reserved (if any) /// public void BlockAtCurrentPosition () { BlockAt(transform.position); } /// /// Block node closest to the specified position. /// /// Will unblock the last node that was reserved (if any) /// public void BlockAt (Vector3 position) { Unblock(); var node = AstarPath.active.GetNearest(position, NNConstraint.None).node; if (node != null) { Block(node); } } /// /// Block specified node. /// /// Will unblock the last node that was reserved (if any) /// public void Block (GraphNode node) { if (node == null) throw new System.ArgumentNullException("node"); manager.InternalBlock(node, this); lastBlocked = node; } /// Unblock the last node that was blocked (if any) public void Unblock () { if (lastBlocked == null || lastBlocked.Destroyed) { lastBlocked = null; return; } manager.InternalUnblock(lastBlocked, this); lastBlocked = null; } } }