我想在我的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");
}
}
但是我不能使用交互系统。任何人都有线索?
答案 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);
}
}
}
}