HTC Vive 通过Unity实现手柄控制移动和拾取效果

1、打开Unity,导入SteamVR插件

2、删除场景中自带的摄像机,把SteamVR中的CameraRig拖到场景中。

如图2.1 其中Controller为手柄 分左右手柄 Camera指头盔,其中Camera(eye)来控制视角  Camera(ears)来侦听游戏当中的声音。


3.为其中的一个控制器添加脚本组件 ,取名为MoveControl

4.在MoveControl中书写控制移动脚本

    //控制器
    SteamVR_TrackedObject myController;
    //获取右手柄
    SteamVR_Controller.Device rightDevice; 
myController = this.gameObject.GetComponent<SteamVR_TrackedObject>();//初始化控制器
rightDevice = SteamVR_Controller.Input((int)myController.index);//初始化右手柄
  //检测按键并实现上下左右的移动
if(rightDevice.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad))
        {
            Vector2 cc = rightDevice.GetAxis();

            float angle = Vector2.Angle(new Vector2(1, 0), cc);

            Vector3 cross = Vector3.Cross(new Vector2(1, 0), cc);

            if(cross.z<0)
            {
                angle *= -1;
            }

            if(angle>45&&angle<135)
            {
                player.transform.Translate(cube.transform.forward * speed * Time.deltaTime);
            }
            if (angle > -135 && angle < -45)
            {
                player.transform.Translate(-cube.transform.forward * speed * Time.deltaTime);
            }
            if(angle>135&&angle<180||angle>-180&&angle<-135)
            {
                player.transform.Translate(-cube.transform.right * speed * Time.deltaTime);
            }
            if (angle > 0 && angle < 45 || angle > -45&& angle < 0)
            {
                player.transform.Translate(cube.transform.right * speed * Time.deltaTime);
            }
        }

这里是通过角度来检测按的是上下左右的。其中的player是CameraRig此时只实现了上下左右的平移,其中的cube为新的游戏物体用于把头盔的旋转角度传递给CameraRig

接下来实现视角的跟随,也就是CameraRig的视角随着头盔的移动而移动

 transform.localEulerAngles = new Vector3(0, eye.transform.localEulerAngles.y, 0);

这里是把头盔沿着Y轴的旋转角度赋值给了cube然后再传递给CameraRig.

实现物体的拾取:

if(rightDevice.GetPress(SteamVR_Controller.ButtonMask.Trigger))
        {
            if(isTrigger)
            {
                cy.transform.position = this.transform.position;
                cy.transform.localEulerAngles = this.transform.position;
            }
        }
        else if((rightDevice.GetPressUp(SteamVR_Controller.ButtonMask.Trigger)))
        {
            isTrigger = false;
        }

private void OnTriggerEnter(Collision other)
    {
        if(other.gameObject.tag=="c")
        {
            isTrigger = true;
        }
    }
}

这里是通过触发器来实现当手柄接触到物体的时候,此时物体的位置以及旋转 角度与手柄的一致,从而实现手柄的拾取功能。

对于此文章有疑惑的可以加我QQ:741889106 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值