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