赞
踩
通过之前的教程,我们已经可以在虚拟世界里互动了,但简单的互动怎么能满足我在虚拟现实世界里为所欲为的愿望:)
为了搞点事情出来,还得通过按钮触发事件.
vrtk中事件的触发是基于这个类的:VRTK_ControllerEvents
这个类提供一个枚举,可以用来判断按钮是否按下.类似于unity中判断键盘中哪个键被按下.Keycode.space
此外,还提供了判断哪个键是否被按下的成员变量,默认都是false
还有类的事件.通过事件,可以创建事件触发,比如trigger被按下会发生什么事.
按键可参考:VRTK按键触发事件整理归纳(适用于SteamVR)_ChengDengKe的博客-CSDN博客_vrtk 事件
看名字都很好理解,这里就讲一下
那么问题来了,如果我想通过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中控制小汽车)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。