如何在使用SteamVR交互系统时获得控制器输入

时间:2017-04-20 18:33:35

标签: c# unity3d steam virtual-reality

我想在我的VR游戏中简单地从用户那里获得控制器输入,我也想使用SteamVR交互系统,这样我就可以实现简单的UI工作。但是,我无法从Hand脚本中获取控制器的输入。

我所做的只是拖入“播放器”预制件,然后编写一个脚本来继续使用Hand对象从触发器获取输入。

    private Hand _hand;                     // The hand object
    private SteamVR_Controller.Device controller; // the controller property of the hand


    void Start ()
    {
        // Get the hand componenet
        _hand = GetComponent<Hand>();
        // Set the controller reference
        controller = _hand.controller;
    }

    void Update ()
    {
            // === NULL REFERENCE === //
        if ( controller.GetHairTrigger())
        {
            Debug.Log ("Trigger");
        }

    }

这给了我一个“控制器”对象的空引用异常。我还尝试在OnEnable()Awake()中获取控制器组件,但这也不起作用。即使在Update()。因此,由于某种原因,Hand类的SteamVR不保存对控制器的引用。我做错了什么?当我拿到控制器时,我错过了某种索引规范吗?

我可以像这样得到控制器输入:

   private SteamVR_TrackedObject trackedObj;       // The tracked object that is the controller

    private SteamVR_Controller.Device Controller    // The device property that is the controller, so that we can tell what index we are on
    {
        get { return SteamVR_Controller.Input((int)trackedObj.index); }
    }

    private void Awake()
    {
        // Get the tracked object componenet
        trackedObj = GetComponent<SteamVR_TrackedObject>();
    }

    void Update()
 {
     if(Controller.GetHairTrigger()){
          Debug.Log("hey trigger");
     }
  }

但是我不能使用交互系统。任何人都有线索?

3 个答案:

答案 0 :(得分:2)

我真的建议你在SteamVR集成之上添加Valve的免费HTC.UnityPlugin, 因此,您可以使用

快速访问控制器输入
using UnityEngine;
using HTC.UnityPlugin.Vive;
public class YourClass : MonoBehaviour
{
    private void Update()
    {
        // get trigger
        if (ViveInput.GetPressDown(HandRole.RightHand, ControllerButton.Trigger))
        {
            // ...
        }
    }
}

答案 1 :(得分:1)

如果不安装除SteamVR之外的任何其他依赖项,请将脚本附加到其中一个Hand组件。它是SteamVR资产文件夹中Player预制件的子项。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Grab: MonoBehaviour {
    private Valve.VR.InteractionSystem.Hand hand;

    void Start () {
        hand = gameObject.GetComponent<Valve.VR.InteractionSystem.Hand>();
    }

    void Update () {
        if (hand.controller == null) return;

        // Change the ButtonMask to access other inputs
        if (hand.controller.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
        {
            Debug.Log("Trigger down")
        }

        if (hand.controller.GetPress(SteamVR_Controller.ButtonMask.Trigger))
        {
            Debug.Log("Trigger still down")
        }

        if (hand.controller.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
        {
            Debug.Log("Trigger released")
        }
    }
}

答案 2 :(得分:0)

这是如何用手操作:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Valve.VR.InteractionSystem;

    public class ShowControllers : MonoBehaviour
    {
        public bool showController = false;
    
    // Update is called once per frame
    void Update()
        {
            foreach (var hand in Player.instance.hands)
            {
                if (showController)
                {
                    hand.ShowController();
                    hand.SetSkeletonRangeOfMotion(Valve.VR.EVRSkeletalMotionRange.WithController);
                }
                else
                {
                    hand.HideController();
                hand.SetSkeletonRangeOfMotion(Valve.VR.EVRSkeletalMotionRange.WithoutController);
            }
            }
        }
    }