- Home /
2D Sprite Rotation
Hello.
I have researched this a lot and tried different suggestions but I can't seem to make it work.
I am making a 2D game and I have an Enemy patrolling via Waypoints.
He seems to move to each Waypoint nicely and even loop back.
But he rotates wrong. I need him to face the next Waypoint and it seems that I have achieved that, but when he starts moving, he moves in a spherical kinda way to get there and not in a straight line.
Any help is appreciated, here's the code.
using UnityEngine;
using System.Collections;
public class EnemyPatrol : MonoBehaviour
{
public Transform[] waypoints;
public float patrolSpeed = 3;
bool loop = true;
bool goingBack = false;
public float pauseDuration = 0;
public float smooth = 5;
private float curTime;
private int currentWaypoint = 0;
void Start ()
{
}
void Update ()
{
if (currentWaypoint == 0)
goingBack = false;
if (currentWaypoint < waypoints.Length && goingBack == false)
Patrol ();
else
if (loop)
PatrolBack ();
}
void Patrol ()
{
Vector3 target = waypoints [currentWaypoint].position;
Vector3 moveDirection = target - transform.position;
print ("Move Direction: " + moveDirection);
if (moveDirection.magnitude < 0.5f) {
if (curTime == 0)
curTime = Time.time;
if ((Time.time - curTime) >= pauseDuration) {
currentWaypoint++;
curTime = 0;
}
} else
{
float angle = (Mathf.Atan2(moveDirection.y, moveDirection.x) * Mathf.Rad2Deg) + 90;
Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward);
transform.rotation = Quaternion.Lerp(transform.rotation, q, Time.deltaTime * smooth);
print("Rotation: " + angle);
transform.Translate (moveDirection.normalized * patrolSpeed * Time.deltaTime);
}
}
void PatrolBack ()
{
goingBack = true;
Vector3 target = waypoints [currentWaypoint-1].position;
Vector3 moveDirection = target - transform.position;
if (moveDirection.magnitude < 0.5f) {
if (curTime == 0)
curTime = Time.time;
if ((Time.time - curTime) >= pauseDuration) {
currentWaypoint--;
curTime = 0;
}
} else
{
float angle = (Mathf.Atan2(moveDirection.y, moveDirection.x) * Mathf.Rad2Deg) + 90;
Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward);
transform.rotation = Quaternion.Lerp(transform.rotation, q, Time.deltaTime * smooth);
transform.Translate (moveDirection.normalized * patrolSpeed * Time.deltaTime);
}
}
}
Comment