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.
211 lines
7.9 KiB
C#
211 lines
7.9 KiB
C#
6 months ago
|
#if UNITY_STANDALONE_WIN || UNITY_EDITOR
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
using Valve.VR;
|
||
|
|
||
|
namespace Autohand.Demo {
|
||
|
[HelpURL("https://app.gitbook.com/s/5zKO0EvOjzUDeT2aiFk3/auto-hand/controller-input")]
|
||
|
public class IndexHandControllerLink : HandControllerLink {
|
||
|
|
||
|
float GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum finger) {
|
||
|
switch(finger){
|
||
|
case SteamVR_Skeleton_FingerIndexEnum.index:
|
||
|
return skeletonAction.GetFingerCurl(finger)*indexMax;
|
||
|
case SteamVR_Skeleton_FingerIndexEnum.middle:
|
||
|
return skeletonAction.GetFingerCurl(finger)*middleMax;
|
||
|
case SteamVR_Skeleton_FingerIndexEnum.ring:
|
||
|
return skeletonAction.GetFingerCurl(finger)*ringMax;
|
||
|
case SteamVR_Skeleton_FingerIndexEnum.pinky:
|
||
|
return skeletonAction.GetFingerCurl(finger)*pinkyMax;
|
||
|
case SteamVR_Skeleton_FingerIndexEnum.thumb:
|
||
|
return skeletonAction.GetFingerCurl(finger)*thumbMax;
|
||
|
};
|
||
|
return skeletonAction.GetFingerCurl(finger);
|
||
|
}
|
||
|
|
||
|
//YOU CAN INCREASE THE FINGER BEND SPEED BY INCREASING THE fingerSmoothSpeed VALUE ON EACH FINGER
|
||
|
//YOU CAN DISABLE FINGER SWAY BY TURNING SWAY STRENGTH ON HAND TO 0 OR DISABLEIK ENABLED
|
||
|
|
||
|
public SteamVR_Input_Sources handType;
|
||
|
public SteamVR_Action_Skeleton skeletonAction;
|
||
|
[Tooltip("Allows fingers to move while holding an object"), Space]
|
||
|
public bool freeFingers = true;
|
||
|
|
||
|
[Header("Bend Fingers")]
|
||
|
public Finger thumb;
|
||
|
public Finger index;
|
||
|
public Finger middle;
|
||
|
public Finger ring;
|
||
|
public Finger pinky;
|
||
|
|
||
|
public float thumbMax = 0.8f;
|
||
|
public float indexMax = 1;
|
||
|
public float middleMax = 1;
|
||
|
public float ringMax = 1;
|
||
|
public float pinkyMax = 1;
|
||
|
|
||
|
|
||
|
[Space]
|
||
|
|
||
|
[Header("Grab Finger Action")]
|
||
|
[Tooltip("The required fingers to be bent to the required finger bend to call the grab event, all of these fingers needs to be past the required bend value [Represents AND]")]
|
||
|
public SteamVRFingerBend[] grabFingersRequired;
|
||
|
|
||
|
[Header("Grab Controller Action")]
|
||
|
public SteamVR_Action_Boolean grabAction;
|
||
|
|
||
|
[Header("Squeeze Finger Action"), Space, Space, Space]
|
||
|
[Tooltip("The required fingers to be bent to the required finger bend to call the squeeze event, all of these fingers needs to be past the required bend value [Represents AND]")]
|
||
|
public SteamVRFingerBend[] squeezeFingersRequired;
|
||
|
|
||
|
[Header("Squeeze Controller Axis")]
|
||
|
public SteamVR_Action_Single squeezeAction;
|
||
|
public float requiredSqueeze = 0.8f;
|
||
|
|
||
|
bool grabbing;
|
||
|
bool squeezing;
|
||
|
|
||
|
private void Start() {
|
||
|
if(hand.left)
|
||
|
handLeft = this;
|
||
|
else
|
||
|
handRight = this;
|
||
|
}
|
||
|
|
||
|
|
||
|
public void FixedUpdate() {
|
||
|
if(hand.IsGrabbing())
|
||
|
return;
|
||
|
|
||
|
bool grab = IsGrabbing();
|
||
|
if(!grabbing && grab) {
|
||
|
grabbing = true;
|
||
|
hand.Grab();
|
||
|
}
|
||
|
|
||
|
if(grabbing && !grab) {
|
||
|
grabbing = false;
|
||
|
hand.Release();
|
||
|
}
|
||
|
|
||
|
|
||
|
bool squeeze = IsSqueezing();
|
||
|
if(!squeezing && squeeze) {
|
||
|
squeezing = true;
|
||
|
hand.Squeeze();
|
||
|
}
|
||
|
|
||
|
if(squeezing && !squeeze) {
|
||
|
squeezing = false;
|
||
|
hand.Unsqueeze();
|
||
|
}
|
||
|
|
||
|
|
||
|
if(!hand.holdingObj && !hand.IsPosing()) {
|
||
|
thumb.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.thumb);
|
||
|
index.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.index);
|
||
|
middle.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.middle);
|
||
|
ring.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.ring);
|
||
|
pinky.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.pinky);
|
||
|
|
||
|
thumb.UpdateFinger();
|
||
|
index.UpdateFinger();
|
||
|
middle.UpdateFinger();
|
||
|
ring.UpdateFinger();
|
||
|
pinky.UpdateFinger();
|
||
|
}
|
||
|
else if(freeFingers && !hand.IsPosing()) {
|
||
|
foreach(var finger in hand.fingers)
|
||
|
finger.SetFingerBend(0);
|
||
|
|
||
|
thumb.secondaryOffset = thumb.GetLastHitBend();
|
||
|
index.secondaryOffset = index.GetLastHitBend();
|
||
|
middle.secondaryOffset = middle.GetLastHitBend();
|
||
|
ring.secondaryOffset = ring.GetLastHitBend();
|
||
|
pinky.secondaryOffset = pinky.GetLastHitBend();
|
||
|
|
||
|
|
||
|
if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.thumb) < thumb.GetLastHitBend())
|
||
|
thumb.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.thumb);
|
||
|
|
||
|
if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.index) < index.GetLastHitBend())
|
||
|
index.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.index);
|
||
|
|
||
|
if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.middle) < middle.GetLastHitBend())
|
||
|
middle.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.middle);
|
||
|
|
||
|
if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.ring) < ring.GetLastHitBend())
|
||
|
ring.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.ring);
|
||
|
|
||
|
if(GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.pinky) < pinky.GetLastHitBend())
|
||
|
pinky.secondaryOffset = GetFingerCurl(SteamVR_Skeleton_FingerIndexEnum.pinky);
|
||
|
|
||
|
thumb.UpdateFinger();
|
||
|
index.UpdateFinger();
|
||
|
middle.UpdateFinger();
|
||
|
ring.UpdateFinger();
|
||
|
pinky.UpdateFinger();
|
||
|
}
|
||
|
|
||
|
hand.SetGrip((thumb.secondaryOffset + index.secondaryOffset + middle.secondaryOffset + ring.secondaryOffset + pinky.secondaryOffset) / 5f, (thumb.secondaryOffset + index.secondaryOffset + middle.secondaryOffset + ring.secondaryOffset + pinky.secondaryOffset) / 5f);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
public bool IsGrabbing(){
|
||
|
bool requiredFingers = true;
|
||
|
|
||
|
if(grabFingersRequired.Length == 0)
|
||
|
requiredFingers = false;
|
||
|
else
|
||
|
for (int i = 0; i < grabFingersRequired.Length; i++){
|
||
|
if(GetFingerCurl(grabFingersRequired[i].finger) < grabFingersRequired[i].amount){
|
||
|
requiredFingers = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(grabAction != null && grabAction.GetState(handType)){
|
||
|
requiredFingers = true;
|
||
|
}
|
||
|
|
||
|
return requiredFingers;
|
||
|
}
|
||
|
|
||
|
|
||
|
public bool IsSqueezing(){
|
||
|
bool requiredFingers = true;
|
||
|
|
||
|
if(squeezeFingersRequired.Length == 0)
|
||
|
requiredFingers = false;
|
||
|
else
|
||
|
for (int i = 0; i < squeezeFingersRequired.Length; i++){
|
||
|
if (GetFingerCurl(squeezeFingersRequired[i].finger) < squeezeFingersRequired[i].amount){
|
||
|
requiredFingers = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(squeezeAction != null && squeezeAction.GetAxis(handType) > requiredSqueeze){
|
||
|
requiredFingers = true;
|
||
|
}
|
||
|
|
||
|
return requiredFingers;
|
||
|
}
|
||
|
|
||
|
public override void TryHapticImpulse(float duration, float amp, float freq) {
|
||
|
//SteamVR_Actions.default_Haptic[handType].Execute(0, duration, freq, amp);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[System.Serializable]
|
||
|
public struct SteamVRFingerBend {
|
||
|
public float amount;
|
||
|
public SteamVR_Skeleton_FingerIndexEnum finger;
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
#endif
|