- Home /
How to clamp between two rotations
I have a turret that can be controlled with the arrow keys, rotated left and right. I have been trying to clamp the angles that this turret can rotate using euler angles and the mathf.clamp function. I have the turret working exactly as I'd like. . .on the right arrow key only. The left key has movement but the clamping will not work. I'm not strong at coding and am still trying to fully understand these functions, I believe there is a problem with values I've assigned, between the 320 (minrot) and 40 (maxrot) degrees. Any help appreciated!
//Inside Update function
rot = turretspin.transform.rotation.y;
angley = Mathf.Clamp(angley, maxrot,minrot);
angley2 = Mathf.Clamp(angley2, maxrot,minrot);
if (Input.GetKey(KeyCode.LeftArrow))
{
turretspin.transform.Rotate(Vector3.up, -speed* Time.deltaTime);
if (turretspin.transform.eulerAngles.y > maxrot && turretspin.transform.eulerAngles.y < minrot)
{
turretspin.transform.eulerAngles.y = angley2;
}
}
if (Input.GetKey(KeyCode.RightArrow))
{
turretspin.transform.Rotate(Vector3.up, speed* Time.deltaTime);
if (turretspin.transform.eulerAngles.y > maxrot && turretspin.transform.eulerAngles.y < minrot)
{
turretspin.transform.eulerAngles.y = angley;
}
Possible problem: look at the last line of this document page: http://docs.unity3d.com/ScriptReference/Transform-eulerAngles.html (Which says not to assign/adjust Euler angle coordinates individually.)
turretspin.transform.eulerAngles.y = new Vector3(
turretspin.transform.eulerAngles.x,
angley2,
turretspin.transform.eulerAngles.z);
Perhaps not relevant but, I see no need for your if statement; looks like it just duplicates some of what is done inside the clamp function. Couldn't you just do this after you rotate in either direction?
turretspin.transform.eulerAngles.y = new Vector3(
turretspin.transform.eulerAngles.x,
$$anonymous$$athf.Clamp(turretspin.transform.eulerAngles.y, maxrot,$$anonymous$$rot),
turretspin.transform.eulerAngles.z);
I suggest many debug.logs here, display the angle value before and after you call clamp to see if you can get any clues as to why it's not actually clamping it.
Thanks so much for your help. I managed to finally fix the problem, which lay somewhere I really didn't expect it! Turns out the code was absolutely fine, but the values of 'angley' and 'angley2' had to be set in the inspector to the maximum and $$anonymous$$imum rotation values. I'm still not sure why this is, but using the same idea, managed to successfully clamp vertical movement, so at least it works! :)
Your answer
Follow this Question
Related Questions
How to use a negative value when MathF.Clamping a eulerAngle? 1 Answer
Mathf.Clamp acts strange when going below 0 1 Answer
How to prevent Transform from going through walls? 2 Answers
Limiting rotation based on direction 0 Answers
Rotation around z-axis always local space and not world? Vector-axis angle projection calcuations. 0 Answers