- Home /
How do I make a 2d enemy change direction upon hitting a wall?
I'm trying to make an enemy for my 2d platformer who moves to the right until they reach an edge or a wall, then moving left and repeating the process. I've managed to make it so they turn when reaching an edge, but not when hitting a wall. Instead, they keep running into the wall. Here's my code.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyPatrol : MonoBehaviour
{
public float speed;
public float distance;
private bool movingRight = true;
public Transform groundDetection;
void Update()
{
transform.Translate(Vector2.right * speed * Time.deltaTime);
RaycastHit2D groundInfo = Physics2D.Raycast(groundDetection.position, Vector2.down, distance);
if (groundInfo.collider == false)
{
if (movingRight == true)
{
transform.eulerAngles = new Vector3(0, -180, 0);
movingRight = false;
}
else
{
transform.eulerAngles = new Vector3(0, 0, 0);
movingRight = true;
}
}
private void OnCollisionEnter2D(Collision2D collision)
if (collide.collider.gameObject.tag == "Wall")
{
Debug.Log("E");
if (movingRight == true)
{
transform.eulerAngles = new Vector3(0, -180, 0);
movingRight = false;
}
else
{
transform.eulerAngles = new Vector3(0, 0, 0);
movingRight = true;
}
}
}
}
Comment
Answer by andrew-lukasik · Aug 30, 2020 at 04:01 PM
[SerializeField] Transform wallDetection;
[SerializeField] LayerMask wallLayerMask;
if( movingRight==true )
{
Vector3 origin = wallDetection.position;
Vector3 dir = Vector2.right;
RaycastHit2D hit = Physics2D.Raycast( origin , dir , distance , wallLayerMask );
if( hit.collider!=null )
{
movingRight = false;
Debug.DrawLine( origin , hit.point , Color.red );
}
else Debug.DrawLine( origin , origin + dir*distance , Color.white , 0.01f );
}
else
{
Vector3 origin = wallDetection.position;
Vector3 dir = -Vector2.right;
RaycastHit2D hit = Physics2D.Raycast( origin , dir , distance , wallLayerMask );
if( hit.collider!=null )
{
movingRight = true;
Debug.DrawLine( origin , hit.point , Color.red );
}
else Debug.DrawLine( origin , origin + dir*distance , Color.white , 0.01f );
}
Your answer
Follow this Question
Related Questions
Kill character on impact 1 Answer
Why do the AI get caught on trees? 0 Answers
NavMeshAgent does not follow player 0 Answers
free roaming enemy ai 1 Answer