|
|
|
|
using UnityEngine;
|
|
|
|
|
using System.Collections;
|
|
|
|
|
|
|
|
|
|
namespace Examples.Scenes.TouchpadCamera
|
|
|
|
|
{
|
|
|
|
|
public class RotationConstraint : MonoBehaviour
|
|
|
|
|
{
|
|
|
|
|
public float Min = -15f;
|
|
|
|
|
public float Max = 15f;
|
|
|
|
|
|
|
|
|
|
private Transform _transformCache;
|
|
|
|
|
private Quaternion _minQuaternion;
|
|
|
|
|
private Quaternion _maxQuaternion;
|
|
|
|
|
private Vector3 _rotateAround;
|
|
|
|
|
private float _range;
|
|
|
|
|
|
|
|
|
|
private void Awake()
|
|
|
|
|
{
|
|
|
|
|
_transformCache = transform;
|
|
|
|
|
|
|
|
|
|
_rotateAround = Vector3.right;
|
|
|
|
|
var axisRotation = Quaternion.AngleAxis(_transformCache.localRotation.eulerAngles[0], _rotateAround);
|
|
|
|
|
_minQuaternion = axisRotation * Quaternion.AngleAxis(Min, _rotateAround);
|
|
|
|
|
_maxQuaternion = axisRotation * Quaternion.AngleAxis(Max, _rotateAround);
|
|
|
|
|
_range = Max - Min;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void LateUpdate()
|
|
|
|
|
{
|
|
|
|
|
var localRotation = _transformCache.localRotation;
|
|
|
|
|
var axisRotation = Quaternion.AngleAxis(localRotation.eulerAngles[0], _rotateAround);
|
|
|
|
|
var angleFromMin = Quaternion.Angle(axisRotation, _minQuaternion);
|
|
|
|
|
var angleFromMax = Quaternion.Angle(axisRotation, _maxQuaternion);
|
|
|
|
|
|
|
|
|
|
if (angleFromMin <= _range && angleFromMax <= _range)
|
|
|
|
|
{
|
|
|
|
|
return; // within range
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Let's keep the current rotations around other axes and only
|
|
|
|
|
// correct the axis that has fallen out of range.
|
|
|
|
|
var euler = localRotation.eulerAngles;
|
|
|
|
|
if (angleFromMin > angleFromMax)
|
|
|
|
|
euler[0] = _maxQuaternion.eulerAngles[0];
|
|
|
|
|
else
|
|
|
|
|
euler[0] = _minQuaternion.eulerAngles[0];
|
|
|
|
|
|
|
|
|
|
_transformCache.localEulerAngles = euler;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|