- Home /
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.
Answer by robertbu · Jul 13, 2013 at 05:02 AM
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.
Awesome, thank you so much. I've been banging my head on it all day... and you cleared it right up. better than that, I realized what i did wrong initially.
Thanks again, You're Awesome!