Collission Checker has been Added and Basic Patrolling Enemy Updated to use the Checkers

This commit is contained in:
2022-02-21 16:27:23 +03:00
parent 4cfbf23960
commit cd2f667f56
6 changed files with 406 additions and 166 deletions

View File

@@ -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>();
}
}

View File

@@ -0,0 +1,18 @@
using UnityEngine;
namespace Movement
{
public class CollissionChecker : MonoBehaviour
{
private Collider2D[] nonAllocColliderArray = new Collider2D[5];
public LayerMask LayerMask = ~((1 << 6) | (1 << 7)); // Everything except the "Player" and "Enemy" layer
public bool IsCollided => Physics2D.OverlapBoxNonAlloc(transform.position, transform.localScale, 0, nonAllocColliderArray, LayerMask) != 0;
public void OnDrawGizmosSelected()
{
Gizmos.color = IsCollided ? Color.green : Color.red;
Gizmos.DrawWireCube(transform.position, transform.localScale);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 02e036b6321fff34cbd154fd665a8b23
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: