2025-05-15 16:25:40 +02:00

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