56 lines
2.6 KiB
C#
56 lines
2.6 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;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|