using UnityEngine; [RequireComponent(typeof(Animator))] public class ZibuAnimDriver : MonoBehaviour { public Animator animator; public int defaultLayer = 0; [Range(0f, 0.5f)] public float speedDamp = 0.1f; static readonly int Speed = Animator.StringToHash("Speed"); static readonly int Turn = Animator.StringToHash("Turn"); static readonly int IsGrounded = Animator.StringToHash("IsGrounded"); static readonly int JumpTrig = Animator.StringToHash("Jump"); static readonly int DoubleJumpT = Animator.StringToHash("DoubleJump"); static readonly int LandTrig = Animator.StringToHash("Land"); static readonly int AttackType = Animator.StringToHash("AttackType"); static readonly int HitTrig = Animator.StringToHash("Hit"); void Awake() { if (!animator) animator = GetComponent(); } public void SetSpeed(float v) => animator.SetFloat(Speed, v, speedDamp, Time.deltaTime); public void SetTurn(float v) => animator.SetFloat(Turn, v); public void SetGrounded(bool g) => animator.SetBool(IsGrounded, g); public void PlayAnimation(AnimationState state, float xfade = 0.1f) { switch (state) { case AnimationState.Run: CrossFadeSafe("Run", xfade); break; case AnimationState.RunFast: CrossFadeSafe("RunFast", xfade); break; case AnimationState.Sprint: CrossFadeSafe("Sprint", xfade); break; case AnimationState.Fall: SetGrounded(false); CrossFadeSafe("Fall", xfade); break; case AnimationState.Falling: SetGrounded(false); CrossFadeSafe("Falling", xfade); break; case AnimationState.FallingLoop: SetGrounded(false); CrossFadeSafe("FallingLoop", xfade); break; case AnimationState.JumpStart: animator.SetTrigger(JumpTrig); SetGrounded(false); break; case AnimationState.Land: animator.SetTrigger(LandTrig); SetGrounded(true); CrossFadeSafe("Land", xfade); break; // ... keep rest of your cases the same but call CrossFadeSafe(...) default: CrossFadeSafe(state.ToString(), xfade); break; } } void CrossFadeSafe(string stateName, float transition) { int hash = Animator.StringToHash(stateName); var st = animator.GetCurrentAnimatorStateInfo(defaultLayer); var nxt = animator.GetNextAnimatorStateInfo(defaultLayer); bool inTarget = st.shortNameHash == hash; bool goingTo = animator.IsInTransition(defaultLayer) && nxt.shortNameHash == hash; if (!inTarget && !goingTo) animator.CrossFadeInFixedTime(stateName, transition, defaultLayer, 0f); } }