目的
 

这篇文章的主要目的是让你了解如何在Unity引擎中没有刚体的情况下使用碰撞检测

第一步 介绍
我们实现了一个简单的例子,在这个例子里面,只有垂直运动会被检测,但是通过修改脚本以及在场景中添加物体(或者改变立方体的位置),其他方向的检测也是可以实现的。

Unity是一个3D游戏引擎,它里面内置了一个物理引擎PhysX,这是由Nvidia提供的一个物理引擎。

物理模拟会应用于那些附有刚体组件的游戏物体上。

大部分情况下它是被用于碰撞检测

假设我们只需要从物理引擎里面得到碰撞检测仿真的信息,那么使用物理引擎只进行碰撞检测可能会减少整体的性能。这有两种解决方法:

第二步 解决方案
解决方案 - 1 使刚体具有运动学特性并捕捉触发事件。
解决方案 - 2 不要使用刚体(这可能是最好的解决方案)! ! ! !
第三步 避免使用刚体
那使用什么来代替刚体呢?

射线投射就是一个非常好的选择。这是由Unity引擎提供的众多丰富功能中的一种。而且这个功能还不怎么耗费计算资源。你可以在每一帧中投射几百条射线出去还不会对游戏的性能带来太多的影响。这种方法会从起点(用户指定的)到终点(也是用户指定的)投射一条射线,然后确定这条射线是否与任意的碰撞体相交。

我们可以使用这种方法来处理碰撞检测,通过在xy轴上投射射线来获知游戏物体周围的环境信息。

我们将遵循下面的步骤:

  1.  获取游戏对象的方向信息。
  2.  投射射线。
  3.  通过碰撞结果来确定碰撞信息。

简单的射线投射代码如下所示:

泰课在线

在上面的函数调用中,第一个参数是射线的起点,第二个参数是射线的方向,第三个参数是射线的长度。

Unity引擎中可以得到的结果如下所示:

泰课在线

让我们举个简单的例子来说明下这段代码。当一个立方体与另外一个立方体发生碰撞的时候,我们让这个立方体退回去。

1.    如下图这样摆放三个立方体。

泰课在线

2.    给这三个立方体添加盒子碰撞体。

3.    给位于两个立方体之间的那个立方体添加CollisionDetector 脚本(也就是上图中选中的那个立方体)。

4.    CollisionDetector 脚本中添加代码来让这个立方体再与上方或者下方的立方体发生碰撞的时候会反弹回去。

3.1 CollisionDetector.cs

泰课在线

 

3.2 对上面代码的解释

NoOfRays Moving force都是公有的变量,因此它可以在运行时根据需要来进行改变。确保立方体的移动速度不会超过上方的立方体和底部的立方体之间的距离。

泰课在线

DirectionFactor会乘以运动动力和射线的方向,这是因为它就是用于决定方向的。一开始的时候它的值是设为向上(y轴正方向)的方向。一旦移动的那个立方体与其他立方体发生碰撞的话,那么这个移动方向就会反过来。可以按照改变 direction vector来响应的改变立方体的移动方向。DirectionFactor只用于反转方向。

我希望当你在Unity引擎中不使用刚体来进行碰撞检测的时候,这篇文章能够对你有所帮助。如果你有任何关于Unity的问题,可以加入泰课技术讨论群:373053769