Untitled
Fail NPCunknown
csharp
4 years ago
6.3 kB
7
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...