SteamVR 2.0, как реализовать дистанционный захват? - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь создать свои собственные сценарии, называемые DistanceGrabber для моих рук и DistanceGrabbable для объектов, которые я хочу иметь с расстояния. что я сделал, но сценарий с лазерным указателем заставляет меня сначала отпустить кнопку захвата перед выполнением функции onDistanceGrab в сценарии DistanceGrabbable, поэтому мне пришлось быстро «дважды щелкнуть» и удерживать захват во второй раз, чтобы иметь возможность держите объект в руке, иначе он просто упадет на землю.

, а также

как отключить линию, когда лазер не направлен на захватываемый объект?

Моя настройка:

Unity 2019.2.6f1

SteamVR 2.0

Oculus Rift

Дистанционный скрипт:

 public class DistanceGrabber : MonoBehaviour
 {
     private SteamVR_LaserPointer laserPointer;
     private Hand hand;

     void Awake()
     {
         laserPointer = GetComponent<SteamVR_LaserPointer>();
         hand = GetComponent<Hand>();

         laserPointer.PointerIn += PointerInside;
         laserPointer.PointerOut += PointerOutside;
         laserPointer.PointerClick += PointerClick;

         //interactable = GetComponent<Interactable>();
     }

     public void PointerClick(object sender, PointerEventArgs e)
     {
         if (e.target.GetComponent<DistanceGrabbable>() != null)
         {
             e.target.GetComponent<DistanceGrabbable>().onDistanceGrab(hand);
         }
     }

     public void PointerInside(object sender, PointerEventArgs e)
     {
         if (e.target.GetComponent<Interactable>() != null)
         {
             hand.ShowGrabHint();
             hand.IsStillHovering(e.target.GetComponent<Interactable>());
             laserPointer.active = true;
         }
     }

     public void PointerOutside(object sender, PointerEventArgs e)
     {
         if (e.target.GetComponent<Interactable>() == null)
         {
             hand.HideGrabHint();
             laserPointer.active = false;
         }
     }

Скрипт DistanceGrabbable:

public class DistanceGrabbable : MonoBehaviour
 {
     protected Rigidbody rb;
     protected bool originalKinematicState;
     protected Transform originalParent;

     private void Awake()
     {
         rb = GetComponent<Rigidbody>();
         originalParent = transform.parent;

         originalKinematicState = rb.isKinematic;
     }

     public void onDistanceGrab(Hand hand)
     {
         rb.isKinematic = true;
         transform.SetParent(hand.gameObject.transform);
         hand.AttachObject(gameObject, GrabTypes.Trigger);
     }

     private void OnDetachedFromHand(Hand hand)
     {
         rb.isKinematic = false;
         transform.SetParent(originalParent);
     }
 }
...