摘要:摁下鼠标后武士将挥刀迎击,如果能成功砍到,怪物将四处飞去。不过如果没有砍倒怪物却触到了它,游戏则结束。为了实现这种功能,需要检验武士和怪物之间的冲突,也就是所谓的碰撞检测处理。
在很多游戏中,碰撞检测是非常重要的一环,不过在程序处理方面往往是比较麻烦的。但是在Unity中,只需设定好形状就可以进行碰撞检测的计算
一、分别对各个怪物进行碰撞检测时的问题
首先我们尝试对武士采用立方体,对怪物采用球体来执行碰撞检测。角色之间的碰撞检测,经常采用这种粗略的几何形状来进行。这样做的好处是相较于严格的几何形状,计算量会少很多。而且对于大部分游戏而言,这样的做法都能得到比较逼真的结果。
一般来说,球体的计算量更小。因为游戏中会出现大量的怪物,所以我们选择了计算量尽可能小的球体作为检测形状。
设定好形状之后,就可以用Unity来执行碰撞检测的计算。然后再实现碰撞后武士的行为似乎就大功告成了。不过事实上等游戏运行起来以后,会发现还存在很多问题。
1、一个很大的问题就是,武士会绕开怪物前进的问题
1.跳起来越过
2.从一旁越过
这是因为怪物的碰撞检测形状比武士的小很多。在Unity的碰撞处理中,为了使对象在发生碰撞后仍可以按照原来的前进方向移动,对碰撞对象加入了滑动之类的处理。
让碰撞后的对象进行滑动,多数情况下都会使游戏玩起来更简单自然,不过在我们的这个游戏中却带来了危害。
2、另外还有一个问题是,攻击的难度将加大。
点击鼠标按键后武士开始挥舞砍刀。攻击检测将伴随着这个攻击动作进行。和怪物的碰撞检测相似,我们也是用球体来进行检测。
虽然用于攻击检测的球体尺寸够大,不过从武士的中心位置往内或者往外偏移的地方有可能仍位于攻击范围之外。这样就会出现看起来好像攻击成功了但其实并未成功的情况。
针对这个问题,试着改变碰撞检测的形状及其尺寸也是一种解决方法。不过怪物自身的尺寸本来就很小,如果加大的话又将出现另外一个极端,即“看起来没有击中,结果却集中了”的情况可能会增多。
于是就需要尝试其他的解决办法,如下。
二、把怪物编成小组
游戏中的怪物总是扎堆出现,同一批次的怪物彼此之间比较密集,另外武士总是沿着直线前进,因此即使把同一批怪物编成一个小组来处理好像也没有问题。
于是我们用OniGroup对象把怪物集合起来,将怪物作为它的子元素来处理。碰撞检测也改为对OniGroup对象整体进行。
怪物小组的碰撞家安测使用立方体,尺寸和武士的碰撞检测所用的立方体大抵相同。这样设置以后,武士就不能再越过怪物或者从一侧绕过怪物了。
另外,假设OniGroup检测大奥来自武士的攻击后,作为子元素的所有怪物都将受到攻击。这样一来,前面提到的因为怪物的位置稍有差异就导致攻击不成功的情况就不会再有了。
小结
Unity中允许直接使用模型的形状来进行碰撞检测。不过很多游戏中都采用粗略的形状,而且也能达到很好的效果。特别是那些尺寸比其他角色小很多的角色以及大量对象一起移动的情况下,把它们集中归为一个小组做碰撞检测是很好的办法。