File size: 5,619 Bytes
18a519f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | // ENABLE_VR is not defined on Game Core but the assembly is available with limited features when the XR module is enabled.
#if UNITY_INPUT_SYSTEM_ENABLE_XR && (ENABLE_VR || UNITY_GAMECORE) && !UNITY_FORCE_INPUTSYSTEM_XR_OFF || PACKAGE_DOCS_GENERATION
using UnityEngine.InputSystem.Controls;
using UnityEngine.InputSystem.XR.Haptics;
using UnityEngine.InputSystem.Layouts;
using UnityEngine.XR;
namespace UnityEngine.InputSystem.XR
{
[InputControlLayout(isGenericTypeOfDevice = true, displayName = "XR HMD", canRunInBackground = true)]
public class XRHMD : TrackedDevice
{
/// <summary>
/// The base type of all XR head mounted displays. This can help organize shared behaviour across all HMDs.
/// </summary>
///
/// <remarks>
///
/// To give your head tracking an extra update before rendering:
/// First, enable before render updates on your Device.
///
/// <sample>
/// <code>
/// // JSON
/// {
/// "name" : "MyHMD",
/// "extend" : "HMD",
/// "beforeRender" : "Update"
/// }
/// </code>
/// </sample>
///
/// Then, make sure you put extra `StateEvents` for your HMD on the queue right in time before rendering. Also, if your HMD is a combination of non-tracking and tracking controls, you can update just the tracking by sending a delta event instead of a full state event.
///
/// </remarks>
[InputControl(noisy = true)]
public Vector3Control leftEyePosition { get; private set; }
[InputControl(noisy = true)]
public QuaternionControl leftEyeRotation { get; private set; }
[InputControl(noisy = true)]
public Vector3Control rightEyePosition { get; private set; }
[InputControl(noisy = true)]
public QuaternionControl rightEyeRotation { get; private set; }
[InputControl(noisy = true)]
public Vector3Control centerEyePosition { get; private set; }
[InputControl(noisy = true)]
public QuaternionControl centerEyeRotation { get; private set; }
protected override void FinishSetup()
{
base.FinishSetup();
centerEyePosition = GetChildControl<Vector3Control>("centerEyePosition");
centerEyeRotation = GetChildControl<QuaternionControl>("centerEyeRotation");
leftEyePosition = GetChildControl<Vector3Control>("leftEyePosition");
leftEyeRotation = GetChildControl<QuaternionControl>("leftEyeRotation");
rightEyePosition = GetChildControl<Vector3Control>("rightEyePosition");
rightEyeRotation = GetChildControl<QuaternionControl>("rightEyeRotation");
}
}
/// <summary>
/// The base type for all XR handed controllers.
/// </summary>
[InputControlLayout(commonUsages = new[] { "LeftHand", "RightHand" }, isGenericTypeOfDevice = true, displayName = "XR Controller")]
public class XRController : TrackedDevice
{
/// <summary>
/// A quick accessor for the currently active left handed device.
/// </summary>
/// <remarks>
/// If there is no left hand connected, this will be null.
/// This also matches any currently tracked device that contains the 'LeftHand' device usage.
/// <example>
/// <code>
/// // To set up an Action to specifically target
/// // the left-hand XR controller:
///
/// var action = new InputAction(binding: "/<XRController>{leftHand}/position");
/// </code>
/// </example>
///
/// <example>
/// <code>
/// // To make the left-hand XR controller behave like the right-hand one
/// var controller = XRController.leftHand;
/// InputSystem.SetUsage(controller, CommonUsages.RightHand);
/// </code>
/// </example>
/// </remarks>
public static XRController leftHand => InputSystem.GetDevice<XRController>(CommonUsages.LeftHand);
/// <summary>
/// A quick accessor for the currently active right handed device. This is also tracked via usages on the device.
/// </summary>
/// <remarks>If there is no left hand connected, this will be null. This also matches any currently tracked device that contains the 'RightHand' device usage.</remarks>
public static XRController rightHand => InputSystem.GetDevice<XRController>(CommonUsages.RightHand);
protected override void FinishSetup()
{
base.FinishSetup();
var capabilities = description.capabilities;
var deviceDescriptor = XRDeviceDescriptor.FromJson(capabilities);
if (deviceDescriptor != null)
{
if ((deviceDescriptor.characteristics & InputDeviceCharacteristics.Left) != 0)
InputSystem.SetDeviceUsage(this, CommonUsages.LeftHand);
else if ((deviceDescriptor.characteristics & InputDeviceCharacteristics.Right) != 0)
InputSystem.SetDeviceUsage(this, CommonUsages.RightHand);
}
}
}
/// <summary>
/// Identifies a controller that is capable of rumble or haptics.
/// </summary>
public class XRControllerWithRumble : XRController
{
public void SendImpulse(float amplitude, float duration)
{
var command = SendHapticImpulseCommand.Create(0, amplitude, duration);
ExecuteCommand(ref command);
}
}
}
#endif
|