当前位置:   article > 正文

Unity虚拟现实插件VRTK3.3使用教程四:按钮触发事件_vrtk 按菜单键触发代码

vrtk 按菜单键触发代码

通过之前的教程,我们已经可以在虚拟世界里互动了,但简单的互动怎么能满足我在虚拟现实世界里为所欲为的愿望:)

为了搞点事情出来,还得通过按钮触发事件.

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类,挂在预置体上

  1. using UnityEngine;
  2. public class Toy : MonoBehaviour
  3. {
  4. private bool canRotate = false;
  5. private Vector2 touchAxis;
  6. private float rotationSpeed = 180f;
  7. private void FixedUpdate()
  8. {
  9. ToyRotate();
  10. }
  11. public void SetTouchAxis(Vector2 data)
  12. {
  13. touchAxis = data;
  14. }
  15. private void ToyRotate()
  16. {
  17. float turn = touchAxis.x * rotationSpeed * Time.deltaTime;
  18. this.transform.Rotate(new Vector3(0,turn,0));
  19. }
  20. }

step2:手柄控制器挂上下面RightControllerTest脚本

  1. using UnityEngine;
  2. using VRTK;
  3. public class RightControllerTest : MonoBehaviour
  4. {
  5. public Transform LController;
  6. public Transform RController;
  7. private VRTK_ControllerEvents controllerEvent;
  8. private Transform box;
  9. public GameObject RedCube;
  10. public GameObject BlueCube;
  11. public GameObject GreenCube;
  12. private GameObject toy;
  13. private Toy toyScript;
  14. private void Awake()
  15. {
  16. controllerEvent = GetComponent<VRTK_ControllerEvents>();
  17. box = LController.Find("box");
  18. }
  19. private void OnEnable()
  20. {
  21. controllerEvent.TriggerPressed += OnTriggerPressed;
  22. controllerEvent.TouchpadAxisChanged += DoTouchpadAxisChanged;
  23. }
  24. private void OnDisable()
  25. {
  26. controllerEvent.TriggerPressed -= OnTriggerPressed;
  27. controllerEvent.TouchpadAxisChanged -= DoTouchpadAxisChanged;
  28. }
  29. private void OnTriggerPressed(object sender, ControllerInteractionEventArgs e)
  30. {
  31. toy = Instantiate(RedCube, RController);
  32. toy.transform.localPosition = new Vector3(0, 0.1f, 0);
  33. }
  34. private void DoTouchpadAxisChanged(object sender, ControllerInteractionEventArgs e)
  35. {
  36. toyScript = toy.GetComponent<Toy>();
  37. toyScript.SetTouchAxis(e.touchpadAxis);
  38. }
  39. }

 此外,还可以参考自带demo中的第15个例子(vr中控制小汽车)

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号