通过之前的教程,我们已经可以在虚拟世界里互动了,但简单的互动怎么能满足我在虚拟现实世界里为所欲为的愿望:)
为了搞点事情出来,还得通过按钮触发事件.
vrtk中事件的触发是基于这个类的:VRTK_ControllerEvents
这个类提供一个枚举,可以用来判断按钮是否按下.类似于unity中判断键盘中哪个键被按下.Keycode.space
此外,还提供了判断哪个键是否被按下的成员变量,默认都是false
还有类的事件.通过事件,可以创建事件触发,比如trigger被按下会发生什么事.
按键可参考:VRTK按键触发事件整理归纳(适用于SteamVR)_ChengDengKe的博客-CSDN博客_vrtk 事件
看名字都很好理解,这里就讲一下
- TouchpadAxisChanged - Emitted when the touchpad is being touched in a different location.(其实,就是摇杆摇动时触发),
那么问题来了,如果我想通过vrtk在场景中控制一个物体旋转.类似unity中的float f = Input.GetAxis("Vertical"); 可以获取到一个通过按键得到的0-1的实时变化的值,vrtk中又是如何得到的呢?
回答这个问题,得先看下摇杆事件委托的参数类型.
private void DoTouchpadAxisChanged(object sender, ControllerInteractionEventArgs e)
ControllerInteractionEventArgs用vs查一下引用关系:
它是一个结构体,其中有一个变量叫touchpadAxis,返回的是一个二维变量,这个二维变量就是摇杆移动的单位向量.
好的,运用上面的知识,我们来实现一下VR场景中,右手手柄复制物体,并控制该物体旋转.
step1:新建一个Toy类,挂在预置体上
using UnityEngine;
public class Toy : MonoBehaviour
{
private bool canRotate = false;
private Vector2 touchAxis;
private float rotationSpeed = 180f;
private void FixedUpdate()
{
ToyRotate();
}
public void SetTouchAxis(Vector2 data)
{
touchAxis = data;
}
private void ToyRotate()
{
float turn = touchAxis.x * rotationSpeed * Time.deltaTime;
this.transform.Rotate(new Vector3(0,turn,0));
}
}
step2:手柄控制器挂上下面RightControllerTest脚本
using UnityEngine;
using VRTK;
public class RightControllerTest : MonoBehaviour
{
public Transform LController;
public Transform RController;
private VRTK_ControllerEvents controllerEvent;
private Transform box;
public GameObject RedCube;
public GameObject BlueCube;
public GameObject GreenCube;
private GameObject toy;
private Toy toyScript;
private void Awake()
{
controllerEvent = GetComponent<VRTK_ControllerEvents>();
box = LController.Find("box");
}
private void OnEnable()
{
controllerEvent.TriggerPressed += OnTriggerPressed;
controllerEvent.TouchpadAxisChanged += DoTouchpadAxisChanged;
}
private void OnDisable()
{
controllerEvent.TriggerPressed -= OnTriggerPressed;
controllerEvent.TouchpadAxisChanged -= DoTouchpadAxisChanged;
}
private void OnTriggerPressed(object sender, ControllerInteractionEventArgs e)
{
toy = Instantiate(RedCube, RController);
toy.transform.localPosition = new Vector3(0, 0.1f, 0);
}
private void DoTouchpadAxisChanged(object sender, ControllerInteractionEventArgs e)
{
toyScript = toy.GetComponent<Toy>();
toyScript.SetTouchAxis(e.touchpadAxis);
}
}
此外,还可以参考自带demo中的第15个例子(vr中控制小汽车)