Unity虚拟现实插件VRTK3.3使用教程四:按钮触发事件

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

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

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中控制小汽车)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值