using Movement; using UnityEngine; namespace AI { public class BasicPatrollingEnemyAI : MonoBehaviour { [SerializeField] protected bool isMovingRight = false; protected IMovement movement = null; protected CollissionChecker leftWallChecker = null; protected CollissionChecker rightWallChecker = null; protected CollissionChecker leftGroundChecker = null; protected CollissionChecker rightGroundChecker = null; // If moving Right, and either there's no more ground to move into or there is a wall at the Right side of the enemy OR // If moving Left, and either there's no more ground to move into or there is a wall at the Left side of the enemy // We should change directions private bool ShouldChangeDirection => (isMovingRight && (rightWallChecker.IsCollided || !rightGroundChecker.IsCollided)) || (!isMovingRight && (leftWallChecker.IsCollided || !leftGroundChecker.IsCollided)); protected virtual void Awake() { movement = gameObject.AddComponent(); leftWallChecker = GetCollissionCheckerOnChild("Collission Checkers/Left Wall"); rightWallChecker = GetCollissionCheckerOnChild("Collission Checkers/Right Wall"); leftGroundChecker = GetCollissionCheckerOnChild("Collission Checkers/Left Ground"); rightGroundChecker = GetCollissionCheckerOnChild("Collission Checkers/Right Ground"); } protected virtual void FixedUpdate() { if (ShouldChangeDirection) isMovingRight = !isMovingRight; movement.Move(isMovingRight ? 1f : -1f); } protected CollissionChecker GetCollissionCheckerOnChild(string childName) => transform.Find(childName).GetComponent(); } }