summaryrefslogtreecommitdiff
path: root/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/ExampleScripts/MecanimBridge2D.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/ExampleScripts/MecanimBridge2D.cs')
-rw-r--r--Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/ExampleScripts/MecanimBridge2D.cs90
1 files changed, 90 insertions, 0 deletions
diff --git a/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/ExampleScripts/MecanimBridge2D.cs b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/ExampleScripts/MecanimBridge2D.cs
new file mode 100644
index 0000000..809969c
--- /dev/null
+++ b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/ExampleScripts/MecanimBridge2D.cs
@@ -0,0 +1,90 @@
+using UnityEngine;
+
+namespace Pathfinding.Examples {
+ /// <summary>
+ /// Helper for adding animation to agents.
+ ///
+ /// This script will forward the movement velocity to the animator component using the following animator parameters:
+ ///
+ /// - InputMagnitude: Movement speed, normalized by the agent's natural speed. 1 if the agent is moving at its natural speed, and 0 if it is standing still.
+ /// - X: Horizontal movement speed, normalized by the agent's natural speed.
+ /// - Y: Vertical movement speed, normalized by the agent's natural speed.
+ /// </summary>
+ [HelpURL("https://arongranberg.com/astar/documentation/stable/mecanimbridge2d.html")]
+ public class MecanimBridge2D : VersionedMonoBehaviour {
+ /// <summary>
+ /// How much to smooth the velocity of the agent.
+ ///
+ /// The velocity will be smoothed out over approximately this number of seconds.
+ /// A value of zero indicates no smoothing.
+ /// </summary>
+ public float velocitySmoothing = 1;
+
+ /// <summary>
+ /// The natural movement speed is the speed that the animations are designed for.
+ ///
+ /// One can for example configure the animator to speed up the animation if the agent moves faster than this, or slow it down if the agent moves slower than this.
+ /// </summary>
+ public float naturalSpeed = 5;
+
+ /// <summary>
+ /// How the agent's rotation is handled.
+ ///
+ /// See: <see cref="RotationMode"/>
+ /// </summary>
+ public RotationMode rotationMode = RotationMode.Hide;
+
+ public enum RotationMode {
+ /// <summary>The agent's transform will rotate towards the movement direction</summary>
+ RotateTransform,
+ /// <summary>
+ /// The agent will not visibly rotate.
+ ///
+ /// This is useful if your animation changes the agent's sprite to show a rotation.
+ /// Internally, the agent's rotation property will still return the true rotation of the agent.
+ ///
+ /// This is implemented by setting <see cref="FollowerEntity.updateRotation"/> to false on the agent.
+ /// </summary>
+ Hide,
+ }
+
+ /// <summary>Cached reference to the movement script</summary>
+ IAstarAI ai;
+
+ /// <summary>Cached Animator component</summary>
+ Animator anim;
+
+ Vector2 smoothedVelocity;
+
+ protected override void Awake () {
+ base.Awake();
+ ai = GetComponent<IAstarAI>();
+ anim = GetComponentInChildren<Animator>();
+ }
+
+ void Update () {
+ if (ai == null || anim == null) return;
+
+ var updateRotation = rotationMode == RotationMode.RotateTransform;
+ // TODO: Expose this property using an interface
+ if (ai is AIBase aiBase) aiBase.updateRotation = updateRotation;
+ else if (ai is AILerp aiLerp) aiLerp.updateRotation = updateRotation;
+#if MODULE_ENTITIES
+ else if (ai is FollowerEntity follower) follower.updateRotation = updateRotation;
+#endif
+
+ var desiredVelocity = naturalSpeed > 0 ? ai.desiredVelocity / naturalSpeed : ai.desiredVelocity;
+ var movementPlane = ai.movementPlane;
+ var desiredVelocity2D = (Vector2)movementPlane.ToPlane(desiredVelocity, out var _);
+ anim.SetFloat("NormalizedSpeed", ai.reachedEndOfPath || desiredVelocity2D.magnitude < 0.1f ? 0f : desiredVelocity2D.magnitude);
+
+ smoothedVelocity = Vector3.Lerp(smoothedVelocity, desiredVelocity2D, velocitySmoothing > 0 ? Time.deltaTime / velocitySmoothing : 1);
+ if (smoothedVelocity.magnitude < 0.4f) {
+ smoothedVelocity = smoothedVelocity.normalized * 0.4f;
+ }
+
+ anim.SetFloat("X", smoothedVelocity.x);
+ anim.SetFloat("Y", smoothedVelocity.y);
+ }
+ }
+}