using UnityEngine; using RPG.Movement; using UnityEngine.Rendering; using RPG.Core; namespace RPG.Combat { public class Fighter : MonoBehaviour, IAction { [SerializeField] private float timeBetweenAttacks = 1f; [SerializeField] private float weaponRange = 2f; [SerializeField] private float weaponDamage = 5f; Health target; private float timeSinceLastAttack = 0; void Update() { timeSinceLastAttack += Time.deltaTime; if (target == null) return; if (target.IsDead()) return; if (!GetIsInRange()) { GetComponent().MoveTo(target.transform.position); } else { GetComponent().Cancel(); AttackBehaviour(); } } private void AttackBehaviour() { transform.LookAt(target.transform); if (timeSinceLastAttack > timeBetweenAttacks) { //This will trigger the Hit() event. TriggerAttack(); timeSinceLastAttack = 0; } else return; } private void TriggerAttack() { GetComponent().ResetTrigger("stopAttack"); GetComponent().SetTrigger("attack"); } //Animation event void Hit() { if (target == null) return; target.TakeDamage(weaponDamage); } private bool GetIsInRange() { return Vector3.Distance(transform.position, target.transform.position) <= weaponRange; } public bool CanAttack(GameObject combatTarget) { if (combatTarget == null) return false; Health targetToTest = combatTarget.GetComponent(); return targetToTest != null && !targetToTest.IsDead(); } public void Attack(GameObject combatTarget) { GetComponent().StartAction(this); target = combatTarget.GetComponent(); } public void Cancel() { StopAttack(); target = null; } private void StopAttack() { GetComponent().ResetTrigger("attack"); GetComponent().SetTrigger("stopAttack"); } } }