using System; using System.Linq; using Assets.HeroEditor4D.Common.Scripts.Common.Springs; using Assets.HeroEditor4D.Common.Scripts.Enums; using UnityEngine; namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts { /// /// Used to play animations. /// public class AnimationManager : MonoBehaviour { public Character4D Character; public Animator Animator; public bool IsAction { get => Animator.GetBool("Action"); set => Animator.SetBool("Action", value); } /// /// Set animation parameter State that controls transition. /// public void SetState(CharacterState state) { Animator.SetInteger("State", (int) state); } /// /// Play Attack animation according to selected weapon. /// public void Attack() { switch (Character.WeaponType) { case WeaponType.Melee1H: case WeaponType.Melee2H: Slash1H(); break; case WeaponType.Bow: ShotBow(); break; default: //throw new NotImplementedException("This feature may be implemented in next updates."); Slash1H(); break; } } /// /// Play Slash1H animation. /// public void Slash1H() { Animator.SetTrigger("Slash1H"); IsAction = true; } /// /// Play Slash2H animation. /// public void Slash2H() { Animator.SetTrigger("Slash2H"); IsAction = true; } public void Slash(bool twoHanded) { Animator.SetTrigger(twoHanded ? "Slash2H" : "Slash1H"); IsAction = true; } /// /// Play Jab animation. /// public void Jab() { Animator.SetTrigger("Jab"); IsAction = true; } /// /// Play Slash1H animation. /// public void HeavySlash1H() { Animator.SetTrigger("HeavySlash1H"); IsAction = true; } /// /// Play PowerStab animation. /// public void FastStab() { Animator.SetTrigger("FastStab"); IsAction = true; } /// /// Play Shot animation (bow). /// public void ShotBow() { Animator.SetTrigger("ShotBow"); IsAction = true; } /// /// Play Death animation. /// public void Die() { SetState(CharacterState.Death); } /// /// Play Hit animation. This will just scale character up and down. /// Hit will not break currently playing animation, for example you can Hit character while it's playing Attack animation. /// public void Hit() { Animator.SetTrigger("Hit"); } public void ShieldBlock() { SetState(CharacterState.ShieldBlock); } public void WeaponBlock() { SetState(CharacterState.WeaponBlock); } public void Evade() { Animator.SetTrigger("Evade"); } public void SetTwoHanded(bool twoHanded) { Animator.SetBool("TwoHanded", twoHanded); } public void SetWeaponType(WeaponType weaponType) { Animator.SetInteger("WeaponType", (int) weaponType); } public void Fire() { Animator.SetTrigger("Fire"); IsAction = true; } public void SecondaryShot() { Animator.SetTrigger("SecondaryShot"); IsAction = true; } public void CrossbowShot() { Animator.SetTrigger("Fire"); IsAction = true; if (Character.Parts[0].CompositeWeapon != null) { var loaded = Character.Front.CompositeWeapon.Single(i => i.name == "Side"); var empty = Character.Front.CompositeWeapon.Single(i => i.name == "SideEmpty"); foreach (var part in Character.Parts) { part.PrimaryWeaponRenderer.sprite = part.PrimaryWeaponRenderer.sprite == loaded ? empty : loaded; } } } /// /// Alternative way to Hit character (with a script). /// public void Spring() { ScaleSpring.Begin(this, 1f, 1.1f, 40, 2); } } }