Untitled
Fail NPCunknown
csharp
4 years ago
6.3 kB
13
Indexable
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float movingSpeed = 1;
public LayerMask blockLayer;
private Grid grid;
private CircleCollider2D cc;
private Rigidbody2D rb;
private Vector2[] moveDirections = {Vector2.left, Vector2.right, Vector2.down, Vector2.up };
private Vector2 moveDirection;
public bool lisenceToSwitchDirection = true;
private void Start()
{
grid = GameObject.FindObjectOfType<Grid>();
cc = GetComponent<CircleCollider2D>();
rb = GetComponent<Rigidbody2D>();
cc.radius = 0.45f;
moveDirection = moveDirections[Random.Range(0,4)];
}
private void Update()
{
wallHitDirection();
if (lisenceToSwitchDirection)
{
detectDirections();
}
Debug.DrawRay(new Vector2(transform.position.x + 0.35f, transform.position.y), Vector2.up * 0.5f, Color.green);
Debug.DrawRay(new Vector2(transform.position.x - 0.35f, transform.position.y), Vector2.up * 0.5f, Color.green);
Debug.DrawRay(new Vector2(transform.position.x + 0.35f, transform.position.y), Vector2.down * 0.5f, Color.blue);
Debug.DrawRay(new Vector2(transform.position.x - 0.35f, transform.position.y), Vector2.down * 0.5f, Color.blue);
Debug.DrawRay(new Vector2(transform.position.x, transform.position.y + 0.35f), Vector2.left * 0.5f, Color.red);
Debug.DrawRay(new Vector2(transform.position.x, transform.position.y - 0.35f), Vector2.left * 0.5f, Color.red);
Debug.DrawRay(new Vector2(transform.position.x, transform.position.y + 0.35f), Vector2.right * 0.5f, Color.yellow);
Debug.DrawRay(new Vector2(transform.position.x, transform.position.y - 0.35f), Vector2.right * 0.5f, Color.yellow);
}
private void FixedUpdate()
{
Move();
}
void Move()
{
rb.velocity = moveDirection * Time.deltaTime * movingSpeed;
}
void wallHitDirection()
{
if (detectDirection)
{
grid.GetNearestPointOnGrid(transform.position);
moveDirection = -moveDirection;
}
}
void detectDirections()
{
//When going left or right
if (moveDirection == moveDirections[0] || moveDirection == moveDirections[1])
{
if (!detectUp)
{
grid.GetNearestPointOnGrid(transform.position);
moveDirection = moveDirections[3];
StartCoroutine(holdIt());
}
else if (!detectDown)
{
grid.GetNearestPointOnGrid(transform.position);
moveDirection = moveDirections[2];
StartCoroutine(holdIt());
}
}
//When going down or up
else if (moveDirection == moveDirections[2] || moveDirection == moveDirections[3])
{
if (!detectLeft)
{
grid.GetNearestPointOnGrid(transform.position);
moveDirection = moveDirections[0];
StartCoroutine(holdIt());
}
else if (!detectRight)
{
grid.GetNearestPointOnGrid(transform.position);
moveDirection = moveDirections[1];
StartCoroutine(holdIt());
}
}
}
bool detectDirection
{
get
{
return Physics2D.Raycast(new Vector2(transform.position.x, transform.position.y), moveDirection, 0.5f, blockLayer);
}
}
bool detectUp
{
get
{
RaycastHit2D detectUpLeft = Physics2D.Raycast(new Vector2(transform.position.x - 0.35f, transform.position.y), Vector2.up, 0.6f, blockLayer);
RaycastHit2D detectUpRight = Physics2D.Raycast(new Vector2(transform.position.x + 0.35f, transform.position.y), Vector2.up, 0.6f, blockLayer);
if (detectUpLeft && detectUpRight)
{
return true;
}
else
{
return false;
}
}
}
bool detectDown
{
get
{
RaycastHit2D detectDownLeft = Physics2D.Raycast(new Vector2(transform.position.x - 0.35f, transform.position.y), Vector2.down, 0.6f, blockLayer);
RaycastHit2D detectDownRight = Physics2D.Raycast(new Vector2(transform.position.x + 0.35f, transform.position.y), Vector2.down, 0.6f, blockLayer);
if (detectDownLeft && detectDownRight)
{
return true;
}
else
{
return false;
}
}
}
bool detectLeft
{
get
{
RaycastHit2D detectLeftUp = Physics2D.Raycast(new Vector2(transform.position.x, transform.position.y + 0.35f), Vector2.left, 0.6f, blockLayer);
RaycastHit2D detectLeftDown = Physics2D.Raycast(new Vector2(transform.position.x, transform.position.y - 0.35f), Vector2.left, 0.6f, blockLayer);
if (detectLeftUp && detectLeftDown)
{
return true;
}
else
{
return false;
}
}
}
bool detectRight
{
get
{
RaycastHit2D detectRightUp = Physics2D.Raycast(new Vector2(transform.position.x, transform.position.y + 0.35f), Vector2.right, 0.6f, blockLayer);
RaycastHit2D detectRightDown = Physics2D.Raycast(new Vector2(transform.position.x, transform.position.y - 0.35f), Vector2.right, 0.6f, blockLayer);
if (detectRightUp && detectRightDown)
{
return true;
}
else
{
return false;
}
}
}
IEnumerator holdIt()
{
lisenceToSwitchDirection = false;
float delay = 0.5f;
while(delay > 0)
{
delay -= Time.deltaTime;
yield return null;
}
lisenceToSwitchDirection = true;
}
}
Editor is loading...