This commit is contained in:
2026-06-08 16:11:54 +02:00
parent 4103f5edc7
commit 72cba96dcb
19 changed files with 2151 additions and 783 deletions

View File

@@ -0,0 +1,146 @@
using System;
using System.Linq;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerAnimation : MonoBehaviour
{
public static PlayerAnimation Instance { get; private set; }
[System.Serializable]
public class References
{
public Animator Anim;
}
[System.Serializable]
private class PlayerAnimationStateMapper
{
public Player.PlayerState PlayerState;
public string AnimatorState;
public string BlockingState;
public string Trigger;
}
[SerializeField] private References _references;
[SerializeField, ReadOnly] private PlayerAnimationStateMapper[] _stateMapper;
void OnValidate()
{
Init();
}
void Awake()
{
Init();
if (!Instance)
Instance = this;
}
void LateUpdate()
{
UpdateAnimation();
}
private void Init()
{
_stateMapper = new PlayerAnimationStateMapper[8];
_stateMapper[0] = new PlayerAnimationStateMapper()
{
PlayerState = Player.PlayerState.Idle,
AnimatorState = "move",
BlockingState = "",
Trigger = "trigger_move",
};
_stateMapper[1] = new PlayerAnimationStateMapper()
{
PlayerState = Player.PlayerState.Moving,
AnimatorState = "move",
BlockingState = "",
Trigger = "trigger_move",
};
_stateMapper[2] = new PlayerAnimationStateMapper()
{
PlayerState = Player.PlayerState.Jumping,
AnimatorState = "jump",
BlockingState = "fall",
Trigger = "trigger_jump",
};
_stateMapper[3] = new PlayerAnimationStateMapper()
{
PlayerState = Player.PlayerState.Falling,
AnimatorState = "fall",
BlockingState = "jump",
Trigger = "trigger_fall",
};
_stateMapper[4] = new PlayerAnimationStateMapper()
{
PlayerState = Player.PlayerState.Stunned,
AnimatorState = "stun",
BlockingState = "",
Trigger = "trigger_stun",
};
_stateMapper[5] = new PlayerAnimationStateMapper()
{
PlayerState = Player.PlayerState.Dead,
AnimatorState = "eliminate",
BlockingState = "",
Trigger = "trigger_eliminate",
};
_stateMapper[6] = new PlayerAnimationStateMapper()
{
PlayerState = Player.PlayerState.Loser,
AnimatorState = "lose",
BlockingState = "",
Trigger = "trigger_lose",
};
_stateMapper[7] = new PlayerAnimationStateMapper()
{
PlayerState = Player.PlayerState.Winner,
AnimatorState = "win",
BlockingState = "",
Trigger = "trigger_win",
};
}
private void UpdateAnimation()
{
if (!Player.Instance)
return;
if (_references.Anim.IsInTransition(0))
return;
AnimatorStateInfo currentState = _references.Anim.GetCurrentAnimatorStateInfo(0);
AnimatorStateInfo nextState = _references.Anim.GetNextAnimatorStateInfo(0);
PlayerAnimationStateMapper currentStateMapper = _stateMapper.FirstOrDefault(m => m.PlayerState == Player.Instance.State.CurrentState);
if (currentStateMapper != null &&
!currentState.IsName(currentStateMapper.AnimatorState) &&
!nextState.IsName(currentStateMapper.AnimatorState) &&
!currentState.IsName(currentStateMapper.BlockingState))
{
_references.Anim.SetTrigger(currentStateMapper.Trigger);
}
switch (Player.Instance.State.CurrentState)
{
case Player.PlayerState.Idle:
case Player.PlayerState.Moving:
_references.Anim.SetFloat("move", Player.Instance.State.HorizontalVelocity.magnitude);
_references.Anim.SetFloat("run", Mathf.InverseLerp(0, .8f, Player.Instance.State.Running));
_references.Anim.SetFloat("wall", Player.Instance.State.AnimationCenter * .5f + .5f);
break;
}
}
}