1、创建一个项目,删除掉maincamera,导入SteamVR的包,将teamVR拖进Hierarchy中,创建一个Planne和Sphere,将CameraRig拖动到Hierarchy视图中,SteamVR不用拖动,会自动生成
2、调整小球的大小和位置,给小球添加一个Rigidbody,然后设置mass和drag
3、点击Model,添加一个Collider
3、Edit-->Project Settings-->Time
4、File --> Project Settings --> Physics
5、抓取并投掷的脚本,将该脚本分别挂载到左右手柄的controller上就可以运行
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(SteamVR_TrackedObject))]
public class PickUp : MonoBehaviour {
//追踪的手柄
SteamVR_TrackedObject trackedObj;
//获取输入事件
SteamVR_Controller.Device device;
public Transform sphere;
// Use this for initialization
void Start () {
trackedObj = GetComponent<SteamVR_TrackedObject>();
Debug.Log("Start....................................."+trackedObj.name);
}
// Update is called once per frame
void Update () {
//获取扳机键类型
device = SteamVR_Controller.Input((int)trackedObj.index);
}
private void OnTriggerStay(Collider collider)
{
Debug.Log("OnTriggerStay.....................................");
//抓取物体
//触摸中
if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
{
// 不受重力影响
collider.attachedRigidbody.isKinematic = true;
//将物体设置到父级上
collider.gameObject.transform.SetParent(gameObject.transform);
Debug.Log("GetTouch.....................................");
}
//松开物体
if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))
{
Debug.Log("GetTouchUp.....................................");
// 受重力影响
collider.attachedRigidbody.isKinematic = false;
//将父级置为空
collider.gameObject.transform.SetParent(null);
//投掷物体
tossObject(collider.attachedRigidbody);
}
}
//物体投掷
void tossObject(Rigidbody rigidbody)
{
//如果是起始位置,则设置为起始位置,否则设置为父类
Transform origin = trackedObj.origin ? trackedObj.origin : trackedObj.transform.parent;
//如果起始位置部位空
if(origin != null)
{
//将局部坐标转换成世界坐标
rigidbody.velocity = origin.TransformVector((device.velocity));
rigidbody.angularVelocity = origin.TransformVector((device.angularVelocity));
}
else
{
//设置速度
rigidbody.velocity = device.velocity;
//设置角速度
rigidbody.angularVelocity = device.angularVelocity;
}
}
//重置小球
private void Reset()
{
//扣动扳机键
if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad))
{
//重置位置
sphere.transform.position = Vector3.zero;
//重置速度
sphere.GetComponent<Rigidbody>().velocity = Vector3.zero;
//重置角速度
sphere.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
}
}
}
5、扣动手柄的扳机的时候抓住小球
6、松开扳机时松开物体
7、当松开扳机的同时投掷物体
抛出去之前小球的位置:
抛出去之后小球的位置
参考资料:http://www.taikr.com/course/432/task/8518/show#
一、视野中找不到手柄
原因:1、手柄被隐藏掉了,没有激活
2、在unity5.6以上的版本需要添加Camera(eye)中添加两个脚本Steam VR_Update Poses和Steam VR_Camera
解决办法:选中手柄,勾选左右手柄Controller和Model前面的复选框
分别在搜索框中搜索“SteamVR_UpdatePoses”和“SteamVR_Camera”脚本,并添加给Camera(eye),再次运行手柄就可以被渲染上了
二、其中一个手柄一直接触不到小球
原因:Steam VR_Tracked Object中的Origin没有置为none
解决办法:
点击Controller,在Inspector面板找到Origin
点击右侧的小圆圈,在弹出的窗口中选择“None”
再次运行就可以看到手柄可以正常使用了
三、手柄接触小球后,OnTriggerStay函数没有被调用
原因:collider添加的位置有误。该方法被调用的前提:
-
确保两个物体都有碰撞器,且有一个勾选了触发器
-
确保至少有一个物体有刚体
解决方法:
原来脚本挂载的位置在model上,位置不对,正确设置小球和手柄后,创建的抓取物体的脚本挂载到Controller上就可以了:
正确的做法是:
小球添加一个Collider,但是isTrigger没有勾选,并且添加一个rigidbody
左右手柄的controller分别添加一个collider,并且勾选中trigger
model不添加collider和rigidbody组件