diff --git a/Assets/_Content/Scripts/PlayerAnimation.cs b/Assets/_Content/Scripts/PlayerAnimation.cs new file mode 100644 index 0000000..51b4e11 --- /dev/null +++ b/Assets/_Content/Scripts/PlayerAnimation.cs @@ -0,0 +1,144 @@ +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.Eliminated, + 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); + break; + } + } +} diff --git a/Assets/_Content/Scripts/PlayerAnimation.cs.meta b/Assets/_Content/Scripts/PlayerAnimation.cs.meta new file mode 100644 index 0000000..13d675c --- /dev/null +++ b/Assets/_Content/Scripts/PlayerAnimation.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 93c878c5a040b354b810ab5d574d7dc6 \ No newline at end of file diff --git a/Assets/_Content/Scripts/PlayerCamera.cs b/Assets/_Content/Scripts/PlayerCamera.cs index 064c50b..75dba00 100644 --- a/Assets/_Content/Scripts/PlayerCamera.cs +++ b/Assets/_Content/Scripts/PlayerCamera.cs @@ -60,6 +60,9 @@ public class PlayerCamera : MonoBehaviour void OnEnable() { _lookAction?.Enable(); + + _playerPosition = _references.Target.position; + _pitch = _settings.DefaultPitch; } void OnDisable()