using System; using System.Collections; using System.Collections.Generic; using UnityEngine; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public enum CombatPlayerAnimationParameter { X_DIRECTION, Z_DIRECTION, IS_MOVING, IS_DASHING, IS_READY_MAIN_SKILL, IS_ACTIVATE_MAIN_SKILL, COMBO_ATTACK_COUNT } public enum CombatPlayerAnimationName { DASH_STATE, COMBO_ATTACK1, COMBO_ATTACK2, READY_TO_MAIN_SKILL, MAIN_SKILL } public class CombatAnimator : MonoBehaviour, IAnimationStateController { // Components public Animator Anim { get; set; } // Dictionaries private Dictionary animationParameterHashDictionary = new(); private Dictionary animationNameHashDictionary = new(); // Parameter hashes private static readonly int XDirectionHash = Animator.StringToHash("xDirection"); private static readonly int ZDirectionHash = Animator.StringToHash("zDirection"); private static readonly int IsMovingHash = Animator.StringToHash("isMoving"); private static readonly int IsDashingHash = Animator.StringToHash("isDashing"); private static readonly int IsReadyMainSkillHash = Animator.StringToHash("isReadyMainSkill"); private static readonly int IsActivateMainSkillHash = Animator.StringToHash("isActivateMainSkill"); private static readonly int ComboAttackCount = Animator.StringToHash("ComboAttackCount"); // Animation name hashes private static readonly int DashStateHash = Animator.StringToHash("DashState"); private static readonly int ComboAttack1Hash = Animator.StringToHash("ComboAttack1"); private static readonly int ComboAttack2Hash = Animator.StringToHash("ComboAttack2"); private static readonly int ReadyToMainSkillHash = Animator.StringToHash("ReadyToMainSkill"); private static readonly int MainSkillHash = Animator.StringToHash("MainSkill"); // Unity events private void Awake() { InitDictionary(); } // Init public void InitComponent(Animator animator) { Anim = animator; } private void InitDictionary() { animationParameterHashDictionary = new Dictionary(Enum.GetValues(typeof(CombatPlayerAnimationParameter)).Length) { { CombatPlayerAnimationParameter.X_DIRECTION, XDirectionHash }, { CombatPlayerAnimationParameter.Z_DIRECTION, ZDirectionHash }, { CombatPlayerAnimationParameter.IS_MOVING, IsMovingHash }, { CombatPlayerAnimationParameter.IS_DASHING, IsDashingHash }, { CombatPlayerAnimationParameter.IS_READY_MAIN_SKILL, IsReadyMainSkillHash }, { CombatPlayerAnimationParameter.IS_ACTIVATE_MAIN_SKILL, IsActivateMainSkillHash }, { CombatPlayerAnimationParameter.COMBO_ATTACK_COUNT, ComboAttackCount } }; animationNameHashDictionary = new Dictionary(Enum.GetValues(typeof(CombatPlayerAnimationName)).Length) { { CombatPlayerAnimationName.DASH_STATE, DashStateHash }, { CombatPlayerAnimationName.COMBO_ATTACK1, ComboAttack1Hash }, { CombatPlayerAnimationName.COMBO_ATTACK2, ComboAttack2Hash }, { CombatPlayerAnimationName.READY_TO_MAIN_SKILL, ReadyToMainSkillHash }, { CombatPlayerAnimationName.MAIN_SKILL, MainSkillHash } }; } // Methods public void SetAnimationParameter(T parameter, bool value) where T : Enum { if (parameter is CombatPlayerAnimationParameter enumParameter) { if (animationParameterHashDictionary.TryGetValue(enumParameter, out var hash)) { Anim.SetBool(hash, value); } else { throw new KeyNotFoundException($"The parameter {parameter} was not found in the dictionary."); } } else { throw new ArgumentException("Invalid parameter type for SetAnimationParameter"); } } public void SetAnimationParameter(T parameter, int value) where T : Enum { if (parameter is CombatPlayerAnimationParameter enumParameter) { if (animationParameterHashDictionary.TryGetValue(enumParameter, out var hash)) { Anim.SetInteger(hash, value); } else { throw new KeyNotFoundException($"The parameter {parameter} was not found in the dictionary."); } } else { throw new ArgumentException("Invalid parameter type for SetAnimationParameter"); } } public void SetAnimationParameter(T parameter, float value) where T : Enum { if (parameter is CombatPlayerAnimationParameter enumParameter) { if (animationParameterHashDictionary.TryGetValue(enumParameter, out var hash)) { Anim.SetFloat(hash, value); } else { throw new KeyNotFoundException($"The parameter {parameter} was not found in the dictionary."); } } else { throw new ArgumentException("Invalid parameter type for SetAnimationParameter"); } } public void SetAnimationTrigger(T parameter) where T : Enum { if (parameter is CombatPlayerAnimationParameter enumParameter) { if (animationParameterHashDictionary.TryGetValue(enumParameter, out var hash)) { Anim.SetTrigger(hash); } else { throw new KeyNotFoundException($"The parameter {parameter} was not found in the dictionary."); } } else { throw new ArgumentException("Invalid parameter type for SetAnimationParameter"); } } public bool IsComparingCurrentAnimation(T animationName, int animatorLayer = 0) where T : Enum { if (animationName is not CombatPlayerAnimationName enumAnimationName) { throw new ArgumentException("Invalid parameter type for SetAnimationParameter"); } if (animationNameHashDictionary.TryGetValue(enumAnimationName, out var hash)) { return Anim.GetCurrentAnimatorStateInfo(animatorLayer).shortNameHash == hash; } throw new KeyNotFoundException($"The parameter {animationName} was not found in the dictionary."); } } }