Files
Slender/Assets/Scripts/Assembly-UnityScript/RotationConstraint.cs
T
2026-05-23 14:12:25 +02:00

68 lines
1.4 KiB
C#

using System;
using UnityEngine;
[Serializable]
public class RotationConstraint : MonoBehaviour
{
public ConstraintAxis axis;
public float min;
public float max;
private Transform thisTransform;
private Vector3 rotateAround;
private Quaternion minQuaternion;
private Quaternion maxQuaternion;
private float range;
public virtual void Start()
{
thisTransform = transform;
switch (axis)
{
case ConstraintAxis.X:
rotateAround = Vector3.right;
break;
case ConstraintAxis.Y:
rotateAround = Vector3.up;
break;
case ConstraintAxis.Z:
rotateAround = Vector3.forward;
break;
}
minQuaternion = thisTransform.localRotation * Quaternion.AngleAxis(min, rotateAround);
maxQuaternion = thisTransform.localRotation * Quaternion.AngleAxis(max, rotateAround);
range = max - min;
}
public virtual void LateUpdate()
{
Quaternion localRotation = thisTransform.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];
}
thisTransform.localEulerAngles = eulerAngles;
}
}
public virtual void Main()
{
}
}