diff options
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.cs | 90 |
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); + } + } +} |