How can I limit the rotation of an object temporarily?

Hi,

I’m making a first person game, and I am using the arrow keys to control the camera for now, and if I press multiple keys at the same time, it becomes very disorienting, and hard to get back to where you were looking. So what I need to do is limit certain rotations while the key is pressed, so the player can’t spin the camera out of control. How do I go about doing this?

Thanks in advance.

public Rigidbody rb;
public float speed;
public GameObject player;
public Quaternion currentRotation;

// Use this for initialization
void Start () 
{

}

// Update is called once per frame
void Update () 
{
	//Define Axes
	float forward = Input.GetAxis ("forward");
	float strafe = Input.GetAxis ("strafe");

	//The Vector 3 for movement
	Vector3 Movement = new Vector3 (strafe, 0.0f, forward);

	currentRotation = new Quaternion ();
	currentRotation.Set (transform.rotation.x, transform.rotation.y, transform.rotation.z, 0.0f);
	Debug.Log (currentRotation);

	//Adding the force to move
	rb.AddForce (Movement * speed);

	#region
	//Input from arrow keys, and rotations of the player

	if (Input.GetKey ("right"))
	{
		rb.transform.Rotate(Vector3.up);
	}
			
	if (Input.GetKey ("left"))
	{
		rb.transform.Rotate(Vector3.down);
	}
			
	if (Input.GetKey ("up"))
	{
		rb.transform.Rotate(Vector3.right);
	}
			
	if (Input.GetKey ("down"))
	{
		rb.transform.Rotate(Vector3.left);
	}
		
	#endregion

}

}
`

Good day.

As you are using Rotate, and not seting the rotation itself, its little more difficult. (because if you where change the rotation “manually” you only need to CLAMP it.)
But, in your case, maybe the best is at the end of Update method, create some “if” to detect the rotation for eax axis,m and set it to the limit, like this:

Transform trans = gameObject.transform;

if (trans.EulerAngles.x > 45)
{
trans.EulerAngles = new Vector3 (45, trans.EulerAngles.y, trans.EulerAngles.z);
}

same for Y …

if (trans.EulerAngles.y > 45)
{
trans.EulerAngles = new Vector3 (trans.EulerAngles.x, 45, trans.EulerAngles.z);
}

And same for Z…

So if after Rotate() the value is over 45, it will be 45 again.

Bye!