Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/RotationConstraint.cs
2026-02-21 16:45:37 +08:00

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;
}
}
}