MiniGames/Assets/Scripts/Shared/ZibuAnimDriver.cs

56 lines
2.6 KiB
C#
Raw Normal View History

2025-08-14 20:29:09 +05:00
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;
}
}
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);
}
}