Hey guys
Ive been trying to make a block rotate to certain point when moving with the arrow keys
but for some reason the mathf.clamp doesn’t want to work with the rotate ? I have this same code in the same project where I clamp the position of my player and that works. Any help please! Thanks in advance
Bernard
You have a couple of issues. First, unless you have a good knowledge of Quaternions don’t directly modify the x,y,z,w properties of Quaternion (rotation). In this case, you were probably okay, but directly modifying these values does not necessarily produce the desired result. Instead use “transform.eulerAngles”
Next, on line 11, you are snapping the rotation back to 0 anytime “Horizontal” is 0. Comment out this line and see if the behavior is what you want.
Modifying properties of transform.eulerAngles doesn't really work either; see the note in the docs. For relative movement, use transform.Rotate.
Transform.rotation is a quaternion, which does not use degrees nor does it relate directly to euler angles. You should track the rotation yourself, which is demonstrated clearly in the default MouseLook script including with the character controller standard package.
Robertbu is right, you should avoid directly modifying the quaternion values unless you know what you’re doing. One of the reasons for this however is because the x ,y, z values of the quaternion are not the axis rotation angles as you would expect them to be. It looks like you are trying to modify the angles as Euler angles (0-360 on x,y,z axis’).
I would suggest either using the quaternion helper functions to apply the rotation, or pull out the euler values, modify them, and then push them back. as the below code demonstrates.
function Update()
{
var tmpEuler:Vector3 = transform.eulerAngles;
tmpEuler.z = Mathf.Clamp(tmpEuler, -45, 45);
if (Input.GetAxis("Horizontal") > 0)
{
tmpEuler.z -= 5 * Time.deltaTime;
}
else if (Input.GetAxis("Horizontal") < 0)
{
tmpEuler.z += 5 * Time.deltaTime;
}
transform.eulerAngles = tmpEuler;
}
Two things: you don't need to make temporary variables like that in Unityscript, and see the note in the docs about setting eulerAngles to absolute values rather than incrementing them.
This code above works, except at the clamp there must be tmpEuler.z and not just the vector tmpEuler and it doesn't want to rotate into negative values ? When i go left my rotation.z simply goes to 0 ? Thanks for the speedy replies ! :D
Modifying properties of transform.eulerAngles doesn't really work either; see the note in the docs. For relative movement, use transform.Rotate.
– Eric5h5