Unity2D Check which direction the enemy AI is heading?
Hey I need assistance figuring out which way my AI is going so I can rotate the vehicle if needed.
I tired to us xDir and yDir. The xDir code works great but the yDir code is funky and making the vehicle rotate when going in the x direction.
Here is my code:
using UnityEngine;
using System.Collections;
public class AICarScript : MonoBehaviour {
public Transform[] waypoints;
int cur = 0;
public float speed = 0.3f;
// Use this for initialization
void Start () {
}
void CheckDirection()
{
//Declare x and y movement variables. Ranges from -1 to 1
int xDir = 0;
int yDir = 0;
yDir = waypoints[cur].position.y > transform.position.y ? 1 : -1;
xDir = waypoints[cur].position.x > transform.position.x ? 1 : -1;
//Check if the car is going left or right
if (xDir == 1)
{
GetComponent<SpriteRenderer>().flipX = true;
//GetComponent<Rigidbody2D>().rotation = 0;
}
else if (xDir == -1)
{
GetComponent<SpriteRenderer>().flipX = false;
//GetComponent<Rigidbody2D>().rotation = 0;
}
//Check if the car is going up and down
if (yDir == 1)
{
GetComponent<Rigidbody2D>().rotation = 90;
}
else if (yDir == -1)
{
GetComponent<Rigidbody2D>().rotation = -90;
}
else if (yDir == 0)
{
GetComponent<Rigidbody2D>().rotation = 0;
}
}
// Update is called once per frame
void Update () {
//Waypoint not reached yet? Move towards it
if (transform.position != waypoints[cur].position)
{
Vector2 p = Vector2.MoveTowards(transform.position, waypoints[cur].position, speed);
GetComponent<Rigidbody2D>().MovePosition(p);
CheckDirection();
}
///Waypoint reached
else cur = (cur + 1) % waypoints.Length;
}
bool valid(Vector2 dir)
{
Vector2 pos = transform.position;
RaycastHit2D hit = Physics2D.Linecast(pos + dir, pos);
return (hit.collider == GetComponent<Collider2D>());
}
}
Answer by studioAdam · Dec 02, 2016 at 10:28 PM
Hey @kunald,
You're just manually changing the y rotation of the AI car to be either 90, -90 or 0. You aren't += 90, just hard setting it to one of the three. Perhaps try checking out Transform.Lookat() in place of trying to manipulate the y with those values. You could do it every frame, but maybe just try doing it after you set the new waypoint so you only have to do it once.
gameObject.transform.LookAt(waypoints[cur].transform.position);
https://docs.unity3d.com/ScriptReference/Transform.LookAt.html
I hope that helps.
Cheers.
Hey Adam,
Thanks for the reply. Unfortunately LookAt doesn't work properly with Vector2. It just rotates the sprite on it's Z axis. I tried a work around to stop it from rotating yet it still doesn't rotate on it's y axis when it goes down or up.
I finally was able to figure it out by looking deeper into the LookAt function. Thanks so much for pointing me in the right direction! I would give you points but I have none. lol
Here is how I was able to get it to work. I added this code after I set a new waypoint:
Quaternion rotation = Quaternion.LookRotation(waypoints[cur].transform.position - transform.position, transform.TransformDirection(Vector3.up));
transform.rotation = new Quaternion(0, 0, rotation.x, rotation.w);