86 lines
2.8 KiB
C#
86 lines
2.8 KiB
C#
using UnityEngine;
|
|
|
|
public class TeleportOrientationHandlerThumbstick : TeleportOrientationHandler
|
|
{
|
|
[Tooltip("HeadRelative=Character will orient to match the arrow. ForwardFacing=When user orients to match the arrow, they will be facing the sensors.")]
|
|
public OrientationModes OrientationMode;
|
|
|
|
[Tooltip("Which thumbstick is to be used for adjusting the teleport orientation. Supports LTouch, RTouch, or Touch for either.")]
|
|
public OVRInput.Controller Thumbstick;
|
|
|
|
[Tooltip("The orientation will only change if the thumbstick magnitude is above this value. This will usually be larger than the TeleportInputHandlerAvatarTouch.ThumbstickTeleportThreshold.")]
|
|
public float RotateStickThreshold = 0.8f;
|
|
|
|
private Quaternion _initialRotation;
|
|
|
|
private Quaternion _currentRotation;
|
|
|
|
private Vector2 _lastValidDirection;
|
|
|
|
protected override void InitializeTeleportDestination()
|
|
{
|
|
_initialRotation = base.LocomotionTeleport.GetHeadRotationY();
|
|
_currentRotation = _initialRotation;
|
|
_lastValidDirection = default(Vector2);
|
|
}
|
|
|
|
protected override void UpdateTeleportDestination()
|
|
{
|
|
float num;
|
|
Vector2 lastValidDirection;
|
|
if (Thumbstick == OVRInput.Controller.Touch)
|
|
{
|
|
Vector2 vector = OVRInput.Get(OVRInput.RawAxis2D.LThumbstick);
|
|
Vector2 vector2 = OVRInput.Get(OVRInput.RawAxis2D.RThumbstick);
|
|
float magnitude = vector.magnitude;
|
|
float magnitude2 = vector2.magnitude;
|
|
if (magnitude > magnitude2)
|
|
{
|
|
num = magnitude;
|
|
lastValidDirection = vector;
|
|
}
|
|
else
|
|
{
|
|
num = magnitude2;
|
|
lastValidDirection = vector2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lastValidDirection = ((Thumbstick != OVRInput.Controller.LTouch) ? OVRInput.Get(OVRInput.RawAxis2D.RThumbstick) : OVRInput.Get(OVRInput.RawAxis2D.LThumbstick));
|
|
num = lastValidDirection.magnitude;
|
|
}
|
|
if (!AimData.TargetValid)
|
|
{
|
|
_lastValidDirection = default(Vector2);
|
|
}
|
|
if (num < RotateStickThreshold)
|
|
{
|
|
lastValidDirection = _lastValidDirection;
|
|
num = lastValidDirection.magnitude;
|
|
if (num < RotateStickThreshold)
|
|
{
|
|
_initialRotation = base.LocomotionTeleport.GetHeadRotationY();
|
|
lastValidDirection.x = 0f;
|
|
lastValidDirection.y = 1f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_lastValidDirection = lastValidDirection;
|
|
}
|
|
Quaternion rotation = base.LocomotionTeleport.LocomotionController.CameraRig.trackingSpace.rotation;
|
|
if (num > RotateStickThreshold)
|
|
{
|
|
lastValidDirection /= num;
|
|
Quaternion quaternion = _initialRotation * Quaternion.LookRotation(new Vector3(lastValidDirection.x, 0f, lastValidDirection.y), Vector3.up);
|
|
_currentRotation = rotation * quaternion;
|
|
}
|
|
else
|
|
{
|
|
_currentRotation = rotation * base.LocomotionTeleport.GetHeadRotationY();
|
|
}
|
|
base.LocomotionTeleport.OnUpdateTeleportDestination(AimData.TargetValid, AimData.Destination, _currentRotation, GetLandingOrientation(OrientationMode, _currentRotation));
|
|
}
|
|
}
|