Unity开发备忘录000012:VR头部射线交互
戴上VR头盔,我们就被带进了另一个世界,常用的鼠标和键盘被我们遗忘在现实世界中了,在虚拟世界中的交互成为了一个大问题,好在Unity给我们准备了一个射线机制(这个大家不陌生,在“Unity开发备忘录000009:鼠标交互”一篇中我们用过),从而,我们找到了在VR设计中最简单的一个交互方法——头部射线交互。
Unity中的射线是一种碰撞检测机制,它是3D空间中的一点向一个方向发射的一条虚拟直线,在发射轨迹中与其他物体发生碰撞时,可获得被撞对象的信息。
Unity提供了两个射线类,一个是Ray射线类,另一个是RaycastHit射线投射信息类,前者用于发射射线,后者用于收集射线所碰撞到的物体身上的信息。
例如:Ray类可以声明一个ray变量,可以实现从当前物体的坐标(this.transform.position)处向前方发射一条射线(this.transform.forward)。
Ray ray = new Ray(this.transform.position, this.transform.forward);
当然,也可以用RaycastHit类声明一个变量,用它来接收被撞物体身上的信息,如:
RaycastHit hitInfo;
然后,就可以用碰撞检测组件来获得被撞物体身上的信息了。
bool isLookedAt = Physics.Raycast(ray, out hitInfo, Mathf.Infinity);
此句的意思是,在当前的位置发射一条ray,如果没有阻挡射线将发射到无穷远(Mathf.Infinity),如果有遮挡获取被遮挡物体身上的各种类型的信息(out hitInfo)。
举个小例子:用头部射线击落一个Cube
1. 新建一个Cube,并为其添加刚体Rigdbody,且将Use Gravity(重力)后面的勾取消,使其不具有重力;
2. 编写C#脚本,构建射线碰撞检测,然后将其挂到摄像机上;
Ray ray = new Ray(this.transform.position, this.transform.forward);
RaycastHit hit;
bool isLookedAt = Physics.Raycast(ray, out hit, Mathf.Infinity);
if(isLookedAt) //如果isLookedAt为真,表示有物体与射线相碰撞
{
hit.transform.GetComponent<Renderer>().material.color = Color.red; //获取被碰撞物体身上的材质球,将其颜色置为红色
hit.rigidbody.useGravity = true; //将Use Gravity后面的勾勾上,使其具有重力
}
3. 采用Cardboard VR模式,具体配置见“Unity开发备忘录000010:Unity发布Cardboard VR配置全过程”;
4. 发布apk包,在Android手机上安装运行。可转头寻找Cube,凝视一会Cube,使其变红,用眼神杀掉它!
老孙课堂:fractal.ke.qq.com
工程源码:https://download.****.net/download/sunbowen63/11170965