在游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中检测子弹是否击中敌人,在RPG 游戏中检测是否捡到装备等。在进行碰撞检测时,最常用的工具就是射线,Unity 3D的物理引擎也为用户提供了射线类以及相关的函数接口。
射线是在三维世界中从一个点沿一个方向发射的一条无限长的线。在射线的轨迹上,一旦与添加了碰撞器的模型发生碰撞,将停止发射。用户可以利用射线实现子弹击中目标的检测,鼠标点击拾取物体等功能。
创建一条射线Ray,需要指明射线的起点(origin)和射线的方向(direction),这两个参数也是Ray的成员变量。
定义射线函数:
public Ray(Vector3 origin,Vector3 direction);
射线检测函数:
public static bool Raycast(Ray ray,out RaycastHit hitInfo,float maxDistance,int layerMask);
ray:射线。
RaycastHit:用于存储发射射线后产生的碰撞信息。常用的成员变量有:
collider— —与射线发生碰撞的碰撞器。
distance— —从射线起点到射线与碰撞器的交点的距离。
point——射线与碰撞器交点的坐标(Vector3对象)。
maxDistance:射线的距离(默认无限长)。
layerMask:遮罩(过滤射线,默认所有层都接受射线检测,变量类型为LayerMask)。
接下来举例讲解射线的使用:
(1)新建一个工程RayDemo,保存场景“RayTest”。在场景中创建一个Cube,一个空物体Coin,在Coin容器下创建三个Sphere,并给三个Sphere赋予材质,如图6-15所示。(www.xing528.com)
(2)给三个Sphere添加标签“Coin”,具体方法在5.3.3小节GameObject类中已经讲述过,这里就不再赘述。
(3)给三个Sphere添加新的层Coin。在场景中选中Sphere,点击Inspector视图中Layer旁的“Default”按钮,在下拉菜单中点击“Add Layer...”,如图6-16所示。在弹出的Tags&Layers面板中User Layer8处输入“Coin”,如图6-17所示。这时在Layer的下拉层中就多了Coin层,选中场景中的所有Sphere,点击Layer旁的“Default”→“Coin”,即将场景中的所有球设置为Coin 层,如图6-18 所示。
图6-15 搭建场景
图6-16 添加新层
图6-17 添加Coin 层
图6-18 设置Coin 层
(4)创建一个脚本RayObject,挂载给Main Camera,实现当鼠标点击Cube时,Cube红黄蓝三种颜色交替换装;实现只有射线碰撞到的物体是“Coin”层并且按下鼠标左键的时候才能销毁物体,也就是当射线碰撞到其他层的物体即使鼠标点击左键也不会销毁。即当鼠标点击球的时候,球会销毁,如图6-15 所示,具体代码如下:
(5)按下[Ctrl+S],保存场景并运行程序,在Scene窗口可以看到Main Camera发出的红色射线。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。