Collission Checker has been Added and Basic Patrolling Enemy Updated to use the Checkers
This commit is contained in:
@@ -7,52 +7,39 @@ namespace AI
|
||||
{
|
||||
[SerializeField] protected bool isMovingRight = false;
|
||||
|
||||
[Space]
|
||||
[Header("Left Detector")]
|
||||
[SerializeField] protected Vector2 leftCliffDetectorOrigin = Vector2.left;
|
||||
[SerializeField] protected Vector2 leftCliffDetectorSize = Vector2.one;
|
||||
|
||||
[Space]
|
||||
[Header("Right Detector")]
|
||||
[SerializeField] protected Vector2 rightCliffDetectorOrigin = Vector2.right;
|
||||
[SerializeField] protected Vector2 rightCliffDetectorSize = Vector2.one;
|
||||
|
||||
[Space]
|
||||
[Header("Right Detector")]
|
||||
[SerializeField] protected LayerMask groundLayerMask = ~(1 << 6); // Everything except the "Player" layer
|
||||
|
||||
protected IMovement movement = null;
|
||||
protected Collider2D[] nonAllocColliderArray = new Collider2D[10];
|
||||
|
||||
protected Vector2 leftCliffPosition => GetCliffPositionInWorld(leftCliffDetectorOrigin);
|
||||
protected Vector2 rightCliffPosition => GetCliffPositionInWorld(rightCliffDetectorOrigin);
|
||||
protected CollissionChecker leftWallChecker = null;
|
||||
protected CollissionChecker rightWallChecker = null;
|
||||
protected CollissionChecker leftGroundChecker = null;
|
||||
protected CollissionChecker rightGroundChecker = null;
|
||||
|
||||
protected bool IsLeftDetectorCollided => Physics2D.OverlapBoxNonAlloc(leftCliffPosition, leftCliffDetectorSize, 0, nonAllocColliderArray, groundLayerMask) != 0;
|
||||
protected bool IsRightDetectorCollided => Physics2D.OverlapBoxNonAlloc(rightCliffPosition, rightCliffDetectorSize, 0, nonAllocColliderArray, groundLayerMask) != 0;
|
||||
|
||||
// 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<EnemyMovement>();
|
||||
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 ((isMovingRight && !IsRightDetectorCollided) || (!isMovingRight && !IsLeftDetectorCollided))
|
||||
if (ShouldChangeDirection)
|
||||
isMovingRight = !isMovingRight;
|
||||
|
||||
movement.Move(isMovingRight ? 1f : -1f);
|
||||
}
|
||||
|
||||
protected Vector2 GetCliffPositionInWorld(Vector2 cliffPosition)
|
||||
=> cliffPosition + (Vector2)transform.position;
|
||||
|
||||
protected virtual void OnDrawGizmosSelected()
|
||||
{
|
||||
Gizmos.color = IsLeftDetectorCollided ? Color.green : Color.red;
|
||||
Gizmos.DrawWireCube(leftCliffPosition, leftCliffDetectorSize);
|
||||
|
||||
Gizmos.color = IsRightDetectorCollided ? Color.green : Color.red;
|
||||
Gizmos.DrawWireCube(rightCliffPosition, rightCliffDetectorSize);
|
||||
}
|
||||
protected CollissionChecker GetCollissionCheckerOnChild(string childName)
|
||||
=> transform.Find(childName).GetComponent<CollissionChecker>();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user