通过做unity3d的demo,我发现了一些小问题,并且解决了不少,遇到的问题我没有及时记录下来,以后我会通过随笔的方式记录下我的成长经历,在这里先缅怀下我逝去的时光。T.T..
However,从今天开始做的第一件事,就是把我做的demo的功能更新的实现方法放在这里,供大家日后参考,以提供小小的解决方案。
先放一张游戏图,做的是一个人,在地图上行走,今天要讲到的是,关于如何实现空气墙的讨论。
众所周知,一般来说,地图是有限制大小的,我们不需要玩家跑到一些限制地点,例如地图的极限边缘,这样就失去了可控性,而且容易触发各种意外。所以最好的方式是限制玩家的行动范围,这就出现了游戏中著名的空气墙,明明3D游戏中,可以看得到眼前的景象,却被一堵空气墙挡住了去路。这不是不让你去,而是你过去了,就麻烦了,所以,称得上是良心的作品,一般范围会放的很宽,因为考虑的更多了嘛,而一些赶工的作品呢,为了避免遇见突发情况,就喜欢将玩家尽可能关在“空气墙里”,这样更容易写程序。题外话说多了,我们来讲一讲原理吧。其实空气墙是基于collider的碰撞器,碰撞器检测到我们的角色与空气墙接触了,那么就限制我们的角色坐标,不让他越过雷池了,而大多数的空气墙使用什么方法来避免玩家越过呢?
有些人突然会想到,用类似于地图平面,我们能站在平面上,无法穿过去,就是因为地图带有collider属性,如果我们再弄一块 “平面”,竖起来放,加上collider,不就做成了空气墙了吗?这样做是可行的,然而平面---也即是plane是基于mesh 的碰撞检测,是基于mesh顶点的,比较耗费运算资源,而且碰撞壁没有厚度,物体穿过碰撞壁的风险较高。而比较正规的做法应该是用box collider拼接,有利于运算效率和减少误判。相关的例子,可以参考一些官方的demo和一些已经成熟了的游戏demo。
来,那个angry-bots我来给大家截个图,大家就知道了,在那个官方游戏demo里,程序猿是如何实现空气墙的。
大家看到了,在environment下的 collider 里面有好多的capsule 和cube 都是用来拼接出复杂的空气墙系统的,而打开其中的一个cube,我们看到了,在左图中是一个墙面,然而我们无法离墙太近,因为墙面是设有空气墙的,我们在右图中打开mesh,看到了贴图的前面的确竖着黑压压一个长方体块儿。
好了,现在已经和大家讨论了正确使用空气墙的做法了,一起进步吧~~~