using System; using System.Collections; using UnityEngine; namespace BlueWater { public class AnimationController : MonoBehaviour { // Variables #region Variables // Components private Animator _animator; #endregion // Initialize methods #region Initialize Methdos public void InitializeComponents(Animator animator) { _animator = animator; } #endregion // Methods #region Methods public void SetAnimationParameter(string parameter, bool value) { if (!_animator) return; _animator.SetBool(parameter, value); } public void SetAnimationParameter(string parameter, int value) { if (!_animator) return; _animator.SetInteger(parameter, value); } public void SetAnimationParameter(string parameter, float value) { if (!_animator) return; _animator.SetFloat(parameter, value); } public void SetAnimationTrigger(string parameter) { if (!_animator) return; _animator.SetTrigger(parameter); } public bool IsComparingCurrentAnimation(string animationName, int animatorLayer = 0) { if (!_animator) return false; return _animator.GetCurrentAnimatorStateInfo(animatorLayer).IsName(animationName); } public IEnumerator WaitForAnimationToRun(string animationName, Action onSuccess, float timeout = 2f) { var elapsedTime = 0f; while (!IsComparingCurrentAnimation(animationName)) { elapsedTime += Time.deltaTime; yield return null; if (elapsedTime <= timeout) continue; Debug.Log("Timeout waiting for animation state: " + animationName); onSuccess?.Invoke(false); } onSuccess?.Invoke(true); } public void SetCurrentAnimationSpeed(float targetDuration, int animatorLayer = 0) { if (!_animator) return; var animationLength = _animator.GetCurrentAnimatorStateInfo(animatorLayer).length; _animator.speed = animationLength / targetDuration; } public float GetCurrentAnimationNormalizedTime(int animatorLayer = 0) { if (!_animator) return 0f; return _animator.GetCurrentAnimatorStateInfo(animatorLayer).normalizedTime; } public float GetCurrentAnimationLength(int animatorLayer = 0) { if (!_animator) return 0f; return _animator.GetCurrentAnimatorStateInfo(animatorLayer).length; } public void ResetAnimationSpeed() { if (!_animator) return; _animator.speed = 1f; } #endregion } }