87 lines
4.0 KiB
C#
87 lines
4.0 KiB
C#
#if META_SDK
|
|
using Oculus.Interaction;
|
|
#endif
|
|
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
using System.Collections;
|
|
|
|
namespace VRUIP
|
|
{
|
|
public class RotatingElement : Element
|
|
{
|
|
[Header("Element Properties")]
|
|
[SerializeField] private Transform objectToRotate;
|
|
[SerializeField][Range(1,3)] private int reactionIntensity = 1;
|
|
|
|
private LineRenderer _lineRenderer; // FOR VR INPUT
|
|
#if META_SDK
|
|
private RayInteractor _handRayInteractor; // FOR META SDK INPUT
|
|
private RayInteractor _controllerRayInteractor; // FOR META SDK INPUT
|
|
#endif
|
|
|
|
// CONSTANTS
|
|
private const float REACTION_MULTIPLIER = 30; // FOR VR INPUT
|
|
private const float DAMPING_VALUE = 30; // FOR MOUSE INPUT
|
|
private const float REACTION_SPEED = 200;
|
|
|
|
protected override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
RegisterOnOver(RotateTowardsPointer);
|
|
RegisterOnOff(ResetRotation);
|
|
#if !META_SDK
|
|
_lineRenderer = VRUIPManager.instance.lineRenderer;
|
|
#else
|
|
_handRayInteractor = VRUIPManager.instance.handRayInteractor;
|
|
_controllerRayInteractor = VRUIPManager.instance.controllerRayInteractor;
|
|
#endif
|
|
}
|
|
|
|
private void RotateTowardsPointer()
|
|
{
|
|
#if (OCULUS_INTEGRATION || XR_ITK)
|
|
// FOR XR INPUT:
|
|
var pointerEndPosition = transform.InverseTransformPoint(_lineRenderer.GetPosition(_lineRenderer.positionCount - 1));
|
|
var localPosition = objectToRotate.localPosition;
|
|
var offsetX = localPosition.x - pointerEndPosition.x;
|
|
var offsetY = localPosition.y - pointerEndPosition.y;
|
|
var xRot = -offsetY * REACTION_MULTIPLIER * reactionIntensity;
|
|
var yRot = offsetX * REACTION_MULTIPLIER * reactionIntensity;
|
|
#elif META_SDK
|
|
// FOR META SDK INPUT:
|
|
var activeRayInteractor = _handRayInteractor.isActiveAndEnabled ? _handRayInteractor : _controllerRayInteractor;
|
|
if (!activeRayInteractor.isActiveAndEnabled || !activeRayInteractor.CollisionInfo.HasValue) return;
|
|
var pointerEndPosition = transform.InverseTransformPoint(activeRayInteractor.CollisionInfo.Value.Point);
|
|
var localPosition = objectToRotate.localPosition;
|
|
var offsetX = localPosition.x - pointerEndPosition.x;
|
|
var offsetY = localPosition.y - pointerEndPosition.y;
|
|
var xRot = -offsetY * REACTION_MULTIPLIER * reactionIntensity;
|
|
var yRot = offsetX * REACTION_MULTIPLIER * reactionIntensity;
|
|
#else
|
|
// FOR MOUSE INPUT ENABLE THIS AND DISABLE PREVIOUS:
|
|
var screenPosition = mainCamera.WorldToScreenPoint(transform.position);
|
|
var offsetX = screenPosition.x - Mouse.current.position.x.ReadValue();
|
|
var offsetY = screenPosition.y - Mouse.current.position.y.ReadValue();
|
|
var xRot = -offsetY / (DAMPING_VALUE / reactionIntensity);
|
|
var yRot = offsetX / (DAMPING_VALUE / reactionIntensity);
|
|
#endif
|
|
|
|
var localEulerAngles = objectToRotate.localEulerAngles;
|
|
var newX = Mathf.MoveTowardsAngle(localEulerAngles.x, xRot, Time.deltaTime * REACTION_SPEED);
|
|
var newY = Mathf.MoveTowardsAngle(localEulerAngles.y, yRot, Time.deltaTime * REACTION_SPEED);
|
|
localEulerAngles = new Vector3(newX, newY, 0);
|
|
objectToRotate.localEulerAngles = localEulerAngles;
|
|
}
|
|
|
|
private void ResetRotation()
|
|
{
|
|
if (objectToRotate.localEulerAngles == Vector3.zero) return;
|
|
var localEulerAngles = objectToRotate.localEulerAngles;
|
|
var newX = Mathf.MoveTowardsAngle(localEulerAngles.x, 0, Time.deltaTime * REACTION_SPEED);
|
|
var newY = Mathf.MoveTowardsAngle(localEulerAngles.y, 0, Time.deltaTime * REACTION_SPEED);
|
|
localEulerAngles = new Vector3(newX, newY, 0);
|
|
objectToRotate.localEulerAngles = localEulerAngles;
|
|
}
|
|
}
|
|
}
|