using System.Collections; using System.Collections.Generic; using UnityEngine; public class AnimationController : MonoBehaviour { //List of Transforms of both classes models [SerializeField] private List<Transform> modelMercenaryTransforms; [SerializeField] private List<Transform> modelRogueTransforms; //Mouse Postion Transform Object [SerializeField] private Transform mousePosition; //Animators [SerializeField] private List<Animator> animatorsList; //Character flip angle [SerializeField] private float flipAngle; private HealthSystem healthSystem; private Rigidbody characterRB; private Vector3 direction = Vector3.right; //LocalScale of the models private Vector3 rogueLocalScale; private Vector3 mercenaryLocalScale; private Vector3 playerLocalScale; private float velocity_x; private float velocity_y; private float horizontalInput; private bool onGround; private bool jump; private IMovable playerMovement; // Start is called before the first frame update void Start() { rogueLocalScale = new Vector3(1f, 0.5f, 1f); mercenaryLocalScale = new Vector3(0.19f, 0.095f, 0.19f); playerLocalScale = new Vector3(1.4f, 3f, 1.4f); characterRB = GetComponent<Rigidbody>(); healthSystem = GetComponentInChildren<HealthSystem>(); jump = false; playerMovement = GetComponent<IMovable>(); } // Update is called once per frame void Update() { onGround = playerMovement.OnGround(); horizontalInput = Input.GetAxis("Horizontal"); velocity_x = characterRB.velocity.x; velocity_y = characterRB.velocity.y; ActiveAnimatorObject(); CharacterDirection(); } //Character Death void Die(Animator animator) { if (healthSystem.GetHealthPercentage() <= 0) { animator.SetTrigger("Dead"); } } //Character Jump Trigger Animation void Jump(Animator animator) { if (Input.GetButtonDown("Jump") && !jump) { animator.SetTrigger("Jump"); jump = true; } if (onGround) { jump = false; } } //This function will check wich object is active and will set the animator parameters values and run animation functions void ActiveAnimatorObject() { foreach (Animator animator in animatorsList) { if (animator.gameObject.activeSelf == gameObject.activeSelf) { animator.SetBool("OnGround", onGround); animator.SetFloat("Speed", Mathf.Abs(horizontalInput)); animator.SetFloat("Yvelocity", velocity_y); Jump(animator); Die(animator); } } } //This function will change the model direction according to the mouse or input void CharacterDirection() { Vector3 directionToMouse = mousePosition.transform.position - transform.position; float angle = Vector3.SignedAngle(Vector3.right, directionToMouse.normalized, Vector3.forward); if (horizontalInput < 0 || angle > flipAngle || angle < -flipAngle) { direction = Vector3.left; } else if (horizontalInput > 0 || angle < flipAngle || angle > -flipAngle) { direction = Vector3.right; } foreach (Transform modelMercenaryTransform in modelMercenaryTransforms) { modelMercenaryTransform.localScale = new Vector3(direction.x * mercenaryLocalScale.x, mercenaryLocalScale.y, mercenaryLocalScale.z); } foreach (Transform modelRogueTransform in modelRogueTransforms) { modelRogueTransform.localScale = new Vector3(direction.x * rogueLocalScale.x, rogueLocalScale.y, rogueLocalScale.z); } transform.localScale = new Vector3(direction.x * playerLocalScale.x, playerLocalScale.y, playerLocalScale.z); } }