using UnityEngine; public class RotationConstraint : MonoBehaviour { public enum EConstraintAxis { X = 0, Y = 1, Z = 2 } public EConstraintAxis axis; public float min; public float max; private Vector3 rotateAround; private Quaternion minQuaternion; private Quaternion maxQuaternion; private float range; private void Start() { switch (axis) { case EConstraintAxis.X: rotateAround = Vector3.right; break; case EConstraintAxis.Y: rotateAround = Vector3.up; break; case EConstraintAxis.Z: rotateAround = Vector3.forward; break; } Quaternion quaternion = Quaternion.AngleAxis(base.transform.localRotation.eulerAngles[(int)axis], rotateAround); minQuaternion = quaternion * Quaternion.AngleAxis(min, rotateAround); maxQuaternion = quaternion * Quaternion.AngleAxis(max, rotateAround); range = max - min; } private void LateUpdate() { Quaternion localRotation = base.transform.localRotation; Quaternion a = Quaternion.AngleAxis(localRotation.eulerAngles[(int)axis], rotateAround); float num = Quaternion.Angle(a, minQuaternion); float num2 = Quaternion.Angle(a, maxQuaternion); if (!(num <= range) || !(num2 <= range)) { Vector3 eulerAngles = localRotation.eulerAngles; if (num > num2) { eulerAngles[(int)axis] = maxQuaternion.eulerAngles[(int)axis]; } else { eulerAngles[(int)axis] = minQuaternion.eulerAngles[(int)axis]; } base.transform.localEulerAngles = eulerAngles; } } }