查看原文
其他

在Unity引擎中没有刚体的情况下使用碰撞检测

2016-10-09 译者:崔嘉艺 Gad-腾讯游戏开发者平台



目的

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


第一步 介绍

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

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

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

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

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


第二步 解决方案

解决方案 - 1

 使刚体具有运动学特性并捕捉触发事件。

解决方案 - 2


不要使用刚体(这可能是最好的解决方案)! ! ! !


第三步 避免使用刚体

那使用什么来代替刚体呢?

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

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

我们将遵循下面的步骤:

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的问题,请在评论中让我知道。我将尽快给你答复。

【版权声明】

原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。


点击一下立即阅读相关好文章


5个步骤制作完美3GCD腾讯GAD游戏创新大赛


游戏美术3D设计干货回顾为VR优化UE4渲染器


这么做设计才好玩Unity教程


《逆战》原画组长王磊:用创作打造属于自己的标签


......


近期热文

19个实用网站——为游戏提供最佳免费音乐

Unix昔日之魂(二):合并设计



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存