From 8722a9920c1f6119bf6e769cba270e63097f8e25 Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Thu, 23 May 2024 10:08:29 +0800 Subject: + astar project --- .../TurnBased/SingleNodeBlocker.cs | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/TurnBased/SingleNodeBlocker.cs (limited to 'Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/TurnBased/SingleNodeBlocker.cs') diff --git a/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/TurnBased/SingleNodeBlocker.cs b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/TurnBased/SingleNodeBlocker.cs new file mode 100644 index 0000000..496de8e --- /dev/null +++ b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/TurnBased/SingleNodeBlocker.cs @@ -0,0 +1,70 @@ +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: To use this with a movement script, you have to assign the BlockManager's traversal provider to either or . + /// + /// See: TurnBasedAI for example usage + /// + /// See: BlockManager + /// See: turnbased (view in online documentation for working links) + /// See: traversal_provider (view in online documentation for working links) + /// + [HelpURL("https://arongranberg.com/astar/documentation/stable/singlenodeblocker.html")] + 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; + } + } +} -- cgit v1.1-26-g67d0