一、基本的SteamVR使用
SteamVR最基本的组件是“SteamVR/perfabs”路径下的[CameraRig]预设体,直接拖入可以直接拖入场景中使用VR模式。
二、编写手柄交互脚本
通过脚本实现手柄扣动扳机,抓取物体。
1、创建脚本HandControl.cs
具体脚本内容:
using System.Collections; using System.Collections.Generic; using UnityEngine;
publicclassHandControl : MonoBehaviour { /// ///手柄组件 /// private SteamVR_TrackedObject HandTracked; /// ///手柄控制器 /// private SteamVR_Controller.Device HandDevice; /// ///代表触碰到的物体 /// private GameObject BoxObject;
privatevoidStart() { HandTracked = GetComponent //注意,手柄的Index编号并不是Int类型的,使用时必须强制转换成Int类型。 HandDevice = SteamVR_Controller.Input((int)HandTracked.index);//将控制器定位到当前手柄上 }
privatevoidUpdate() { //获取手柄的按键事件,Trigger按键。 if (HandDevice.GetPressDown(SteamVR_Controller.ButtonMask.Trigger) && BoxObject !=null)//判断是否真的按下了Trigger键 { BoxObject.transform.parent = transform;//将物体变成手柄的子物体 Rigidbody rig = BoxObject.GetComponent rig.useGravity = false;//取消重力 rig.isKinematic = true;//不让刚体受到物理学影响 } if(HandDevice.GetPressUp(SteamVR_Controller.ButtonMask.Trigger) && BoxObject !=null) { BoxObject.transform.parent =null; //接触物体与手柄的父子关联 Rigidbody rig = BoxObject.GetComponent rig.useGravity = true;//恢复重力 rig.isKinematic = false;//恢复刚体受到物理学影响 } }
privatevoidOnTriggerEnter(Collider other) { Debug.Log("手柄触碰到物体"); BoxObject = other.transform.gameObject;//保存触碰到的物品信息 } privatevoidOnTriggerExit(Collider other) { Debug.Log("手柄离开物体"); BoxObject = null;//解除与物体的绑定 } privatevoidOnTriggerStay(Collider other) { Debug.Log("手柄不断地震动"); if(BoxObject !=null) HandDevice.TriggerHapticPulse(700);//手柄震动,以及震动频率 } } |
2、将脚本挂载在[CameraRig]下的Controller(left)或者Controller (right)上。之后给手柄添加一个碰撞体,但是碰撞体不需要太过于大,可以调小一点。
3、给需要碰撞的物体添加碰撞体和刚体。
注意:
1、手柄在挂载脚本后,记得添加碰撞体,因为手柄默认是不携带碰撞体组件的。
2、可以通过更改Tag配合BoxObject == “”的方式,指定手柄至于某些物体进行互动,而不是所有触碰到的物体。