通过做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,看到了贴图的前面的确竖着黑压压一个长方体块儿。
下面我就演示如何在自己的地图上添加空气墙吧。
首先第一步,添加一个 plane,这个plane要放大到足够覆盖到地图的一条边才行。
这里需要注意一点了,你看到我的plane的mesh 是已经旋转过的了,刚开始添加的plane是平躺着的,所以需要你调整rotation 属性,来使得 你的plane “竖起来”,像一堵墙一样。接着你要关闭plane的mesh render,这样在游戏运行的时候,这个plane 的绿色mesh线就会消失,变得透明。对了,还有一点尤其是注意的,你调整rotation往往在90度,和270度的时候,都可以让它竖起来变成一堵墙,但是呢?哪一个角度才行呢?答案是-要根据transform的正方向来看。你看我图中的正方向是朝着地图内侧的,这样看似乎不太明显,看下图有个对比的,你就明白了。
通过找不同大家是否发现了什么呢?对,就是那个对着地图水平面的轴,要朝向地图内侧!为什么?因为当角色 从地图内侧走来的时候,如果plane mesh 的朝向不是朝着角色的,那么这个mesh 是不被渲染的,而且 collider 也不会有作用,这是direct3d那一套的默认选择,当然如果你足够牛,修改他的shader的话,实现90度和270,都可以实现碰撞的效果也是可以的~
好了,本人水平有限,就不再讨论其他的空气墙做法了,其实用脚本写地图碰撞检测也挺快的,但是,在一张复杂的地图上,这样就显得有些乏力了,所以,大家练好用小物体填充的方式,做空气墙,对做游戏是非常实用有效的。现在已经和大家讨论了正确使用空气墙的做法了,一起进步吧~~~