OldBlueWater/BlueWater/Assets/02.Scripts/Character/CombatPlayer2D/CombatAnimator.cs

181 lines
7.1 KiB
C#

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<CombatPlayerAnimationParameter, int> animationParameterHashDictionary = new();
private Dictionary<CombatPlayerAnimationName, int> 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<CombatPlayerAnimationParameter, int>(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<CombatPlayerAnimationName, int>(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>(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>(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>(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>(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>(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.");
}
}
}