I'm making a little game where you control a bunker on the ground defending itself from bombers and paratroopers. The bunker has a cannon which the player can rotate to aim at her enemies. My problem is that there is no limit to the rotation, so right now the player can aim the cannon straight down into the ground. What I would like to do is to limit the possible rotation between the values of, say, 0 to 180 along the x-axis.
So how can I limit the rotation values for an object?
You can limit the rotation of an object like this, for example if you wanted to limit the X-rotation of an object between 30 and 150 degrees:
float MinClamp = 30;
float MaxClamp = 150;
// Other movement needs to be calculated first, so
// we use LateUpdate() instead of Update().
void LateUpdate()
{
transform.rotation.eulerAngles = new Vector3(
Mathf.Clamp(transform.rotation.eulerAngles.x, MinClamp, MaxClamp),
transform.rotation.eulerAngles.y,
transform.rotation.eulerAngles.z
);
}
You can obviously modify this to clamp any angle and any value you want, and it can be in its own script file, you don't have to include it in another script.
This limits how far from vertical the Y-axis of an object’s Transform can get. You set yLimit to the cosine of the maximum angle (here, about 45 degrees).
using UnityEngine;
public class RollLimiter : MonoBehaviour
{
public float yLimit = .707f;
Quaternion prior;
void Start()
{
prior = transform.rotation;
}
void Update()
{
if ((transform.rotation * Vector3.up).y < yLimit)
{
transform.rotation = prior;
}
prior = transform.rotation;
}
}