Smoothly rotate Quaternion using random range

Hello, I am simply trying to have my enemy smoothly rotate in a random direction every few seconds when not attacking the hero. So far it all works, but the enemy doesn’t smoothly rotate to the random range

So here is the bit of code controlling his random walking, this sits in update


if(NoTarget == true) //when not targeting hero
{

	speed = .25; // enemy speed changes depending on activity
	
   	if(timer >= 1.5) // timer resets at 2, allowing .5 s to do the rotating
    	{
      	    transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.Euler(Vector3(0,Random.Range(-359,359),0))  , Time.deltaTime*RotateSpeed);
     	}
	transform.Translate(Vector3.forward * speed * Time.deltaTime);
}

Again, it works… just doesn’t do it smoothly… If anyone has any awesome ideas, I would greatly appreciate the help.

Thanks.

The reason it does not work smoothly is that when you rotate, you recalculate the rotation every frame for the .5 seconds you allow for rotation. You need to set it once. I’m not sure you “allow .5 s to do the rotation” since you continue to do a transform.Translate() even while rotating.

Here is a modified version of your script that has smooth rotation. Attach it to a cube in a new scene to start. Then integrate the changes into your app.

#pragma strict
var noTarget = true;
var qTo : Quaternion;
var speed = 1.25;
var rotateSpeed = 3.0;
var timer = 0.0;

function Start() {
  qTo = Quaternion.Euler(Vector3(0.0,Random.Range(-180.0, 180.0), 0.0));

}

function Update() {

	timer += Time.deltaTime;

	if(noTarget == true) {//when not targeting hero	 
	    if(timer > 2) { // timer resets at 2, allowing .5 s to do the rotating
	          qTo = Quaternion.Euler(Vector3(0.0,Random.Range(-180.0, 180.0), 0.0));  
	          timer = 0.0;
	        }
	    transform.rotation = Quaternion.Slerp(transform.rotation, qTo, Time.deltaTime * rotateSpeed);
	    transform.Translate(Vector3.forward * speed * Time.deltaTime);
	}
}

Note that Slerp() will always take the shortest path between two rotations, So it will never rotate more than 180 degrees. Also by using integers in your Random.Range() call, you execute the integer version of Random.Range(), which excludes the end values. You want the float version.