Unity开发备忘录000012:VR头部射线交互

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,使其变红,用眼神杀掉它!

老孙头课堂:https://edu.csdn.net/lecturer/3617

工程源码:https://download.csdn.net/download/sunbowen63/11170965

猜你喜欢

转载自blog.csdn.net/sunbowen63/article/details/90052770