using UnityEngine; using Saltosion.OneWeapon.Enemies; namespace Saltosion.OneWeapon.AI.Behaviours { [RequireComponent(typeof(Enemy))] public class Follow : AIBehaviour { public Transform Target; public float CloseEnoughRadius; public float TargetPositionUpdateFrequency = 5f; public Vector2 TargetDirection { private set; get; } private Enemy Enemy; private float TargetPositionUpdateCooldown; private void Start() { Enemy = GetComponent(); } private void Update() { if (Target != null && TargetPositionUpdateCooldown <= 0) { TargetPositionUpdateCooldown = 1.0f / TargetPositionUpdateFrequency; TargetDirection = Target.position - Enemy.transform.position; } else if (Target == null) { TargetPositionUpdateCooldown = 0.0f; } else { TargetPositionUpdateCooldown -= Time.deltaTime; } } public void SetUpdateFrequency(float freq) { TargetPositionUpdateFrequency = freq; TargetPositionUpdateCooldown = Mathf.Min(TargetPositionUpdateCooldown, 1.0f / freq); } public float GetDistance() { return Target == null ? -1.0f : (Target.position - Enemy.transform.position).magnitude; } public override bool CanBehave() { bool TargetExists = Target != null; if (!TargetExists) { Enemy.StopMoving(); CurrentStatus = "NoTarget"; } return TargetExists; } public override void Execute() { if (Target != null) { if (GetDistance() > CloseEnoughRadius) { Enemy.StartMovingTo((Vector2)Enemy.transform.position + TargetDirection); CurrentStatus = "Approach"; } else { Enemy.StopMoving(); CurrentStatus = "CloseEnough"; } } } private void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, CloseEnoughRadius); } } }