MiniGames/Assets/Scripts/Shared/ZibuAnimDriver.cs
2025-09-09 16:46:17 +05:00

61 lines
2.7 KiB
C#

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<Animator>(); }
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;
}
}
public void PlayState(string stateName, float xfade = 0.1f)
{
if (string.IsNullOrEmpty(stateName)) return;
CrossFadeSafe(stateName, xfade);
}
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);
}
}