using TriInspector; using UnityEngine; namespace R0bbie.Timeline { /// /// Animation StepCmd type, used to control an animation /// [AddComponentMenu("Timeline/Commands/Animation (Step Command)")] [RequireComponent(typeof(Step))] public class AnimationCmd : StepCmd { [Title("Animation Options")] [SerializeField] protected Animator animator; [SerializeField] bool forceAnimation; [InfoBox("If forcing the animation, the animationTrigger string should be the name on the AnimatorState(not the trigger parameter) to be able to force it")] [SerializeField] protected string animationTrigger; /// /// Initialise command (called before Activate) /// protected override void Init() { init = true; } public override void Activate(Step _parentStep) { base.Activate(_parentStep); // Check the necessary command values are set before continuing if (animator == null || string.IsNullOrEmpty(animationTrigger)) { Debug.LogWarning("Tried to activate an AnimationCmd with a null animator or trigger. Couldn't continue."); DeactivateEarly(); return; } // Ensure movement resumed to normal on animator (in case paused before) // The "Speed" float of the animator is used just to set a character idle at the start of an anim so it needs to be setup on the editor // For the resume function we just need to resume the speed on the animator itself animator.speed = 1f; // Play animation if (forceAnimation) animator.Play(animationTrigger); else animator.SetTrigger(animationTrigger); // Ensure GO attached to animator is enabled if (!animator.isActiveAndEnabled) animator.gameObject.SetActive(true); } protected override void Cleanup() { active = false; } #if UNITY_EDITOR public Animator GetAnimator() { return animator; } public string GetAnimatorString() { return animationTrigger; } public bool GetForceAnimation() { return forceAnimation; } public void SetAnimatorEditor(Animator editorAnimator) { animator = editorAnimator; } #endif } }