67 lines
1.5 KiB
C#
67 lines
1.5 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|