You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
6.1 KiB
C#

6 months ago
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
namespace Autohand.Demo{
public enum CommonButton {
gripButton,
menuButton,
primaryButton,
secondaryButton,
triggerButton,
primary2DAxisClick,
primary2DAxisTouch,
#if UNITY_2019_2_OR_NEWER
secondary2DAxisClick,
secondary2DAxisTouch,
#endif
primaryTouch,
secondaryTouch,
none
}
public enum CommonAxis {
trigger,
grip,
none
}
public enum Common2DAxis {
primaryAxis,
secondaryAxis,
none
}
[HelpURL("https://app.gitbook.com/s/5zKO0EvOjzUDeT2aiFk3/auto-hand/controller-input")]
public class XRHandControllerLink : HandControllerLink {
public CommonButton grabButton = CommonButton.triggerButton;
[Tooltip("This axis will bend all the fingers on the hand -> replaced with finger bender scripts")]
public CommonAxis grabAxis = CommonAxis.trigger;
public CommonAxis squeezeAxis = CommonAxis.grip;
public CommonButton squeezeButton = CommonButton.gripButton;
XRNode role;
bool squeezing;
bool grabbing;
InputDevice device;
List<InputDevice> devices = new List<InputDevice>();
private void Start(){
if(grabButton == squeezeButton) {
Debug.LogError("AUTOHAND: You are using the same button for grab and squeeze on HAND CONTROLLER LINK, this may create conflict or errors", this);
}
if(hand.left)
role = XRNode.LeftHand;
else
role = XRNode.RightHand;
if(hand.left)
handLeft = this;
else
handRight = this;
}
void Update(){
InputDevices.GetDevicesAtXRNode(role, devices);
if(devices.Count > 0)
device = devices[0];
if(device != null && device.isValid){
//Sets hand fingers wrap
hand.SetGrip(GetAxis(grabAxis), GetAxis(squeezeAxis));
//Grab input
if(device.TryGetFeatureValue(GetCommonButton(grabButton), out bool grip)) {
if(grabbing && !grip){
hand.Release();
grabbing = false;
}
else if(!grabbing && grip){
hand.Grab();
grabbing = true;
}
}
//Squeeze input
if(device.TryGetFeatureValue(GetCommonButton(squeezeButton), out bool squeeze)) {
if(squeezing && !squeeze){
hand.Unsqueeze();
squeezing = false;
}
else if(!squeezing && squeeze){
hand.Squeeze();
squeezing = true;
}
}
}
}
public List<InputDevice> Devices() { return devices; }
public bool ButtonPressed(CommonButton button) {
if (button == CommonButton.none)
return false;
if(device.TryGetFeatureValue(GetCommonButton(button), out bool pressed)) {
return pressed;
}
return false;
}
public float GetAxis(CommonAxis axis){
if (axis == CommonAxis.none)
return 0;
if(device.TryGetFeatureValue(GetCommonAxis(axis), out float axisValue)) {
return axisValue;
}
return 0;
}
public Vector2 GetAxis2D(Common2DAxis axis) {
if (axis == Common2DAxis.none)
return Vector2.zero;
if(device.TryGetFeatureValue(GetCommon2DAxis(axis), out Vector2 axisValue)) {
return axisValue;
}
return Vector2.zero;
}
/// <param name="freq">not supported on XR?</param>
public override void TryHapticImpulse(float duration, float amp, float freq = 0) {
foreach(var device in Devices()) {
if(device.TryGetHapticCapabilities(out var capabilities) && capabilities.supportsImpulse) {
device.SendHapticImpulse(0u, amp, duration);
}
}
}
public static InputFeatureUsage<bool> GetCommonButton(CommonButton button) {
if(button == CommonButton.gripButton)
return CommonUsages.gripButton;
if(button == CommonButton.menuButton)
return CommonUsages.menuButton;
if(button == CommonButton.primary2DAxisClick)
return CommonUsages.primary2DAxisClick;
if(button == CommonButton.primary2DAxisTouch)
return CommonUsages.primary2DAxisTouch;
if(button == CommonButton.primaryButton)
return CommonUsages.primaryButton;
if(button == CommonButton.primaryTouch)
return CommonUsages.primaryTouch;
#if UNITY_2019_2_OR_NEWER
if (button == CommonButton.secondary2DAxisClick)
return CommonUsages.secondary2DAxisClick;
if(button == CommonButton.secondary2DAxisTouch)
return CommonUsages.secondary2DAxisTouch;
#endif
if(button == CommonButton.secondaryButton)
return CommonUsages.secondaryButton;
if(button == CommonButton.secondaryTouch)
return CommonUsages.secondaryTouch;
return CommonUsages.triggerButton;
}
public static InputFeatureUsage<float> GetCommonAxis(CommonAxis axis) {
if(axis == CommonAxis.grip)
return CommonUsages.grip;
else
return CommonUsages.trigger;
}
public static InputFeatureUsage<Vector2> GetCommon2DAxis(Common2DAxis axis) {
if(axis == Common2DAxis.primaryAxis)
return CommonUsages.primary2DAxis;
else
return CommonUsages.secondary2DAxis;
}
}
}