经过作unity3d的demo,我发现了一些小问题,而且解决了很多,遇到的问题我没有及时记录下来,之后我会经过随笔的方式记录下个人成长经历,在这里先缅怀下我逝去的时光。T.T..ide
However,从今天开始作的第一件事,就是把我作的demo的功能更新的实现方法放在这里,供你们往后参考,以提供小小的解决方案。3d
先放一张游戏图,作的是一我的,在地图上行走,今天要讲到的是,关于如何实现空气墙的讨论。orm
众所周知,通常来讲,地图是有限制大小的,咱们不须要玩家跑到一些限制地点,例如地图的极限边缘,这样就失去了可控性,并且容易触发各类意外。因此最好的方式是限制玩家的行动范围,这就出现了游戏中著名的空气墙,明明3D游戏中,能够看获得眼前的景象,却被一堵空气墙挡住了去路。这不是不让你去,而是你过去了,就麻烦了,因此,称得上是良心的做品,通常范围会放的很宽,由于考虑的更多了嘛,而一些赶工的做品呢,为了不碰见突发状况,就喜欢将玩家尽量关在“空气墙里”,这样更容易写程序。题外话说多了,咱们来说一讲原理吧。其实空气墙是基于collider的碰撞器,碰撞器检测到咱们的角色与空气墙接触了,那么就限制咱们的角色坐标,不让他越过雷池了,而大多数的空气墙使用什么方法来避免玩家越过呢?blog
有些人忽然会想到,用相似于地图平面,咱们能站在平面上,没法穿过去,就是由于地图带有collider属性,若是咱们再弄一块 “平面”,竖起来放,加上collider,不就作成了空气墙了吗?这样作是可行的,然而平面---也便是plane是基于mesh 的碰撞检测,是基于mesh顶点的,比较耗费运算资源,并且碰撞壁没有厚度,物体穿过碰撞壁的风险较高。而比较正规的作法应该是用box collider拼接,有利于运算效率和减小误判。相关的例子,能够参考一些官方的demo和一些已经成熟了的游戏demo。游戏
来,那个angry-bots我来给你们截个图,你们就知道了,在那个官方游戏demo里,程序猿是如何实现空气墙的。资源
你们看到了,在environment下的 collider 里面有好多的capsule 和cube 都是用来拼接出复杂的空气墙系统的,而打开其中的一个cube,咱们看到了,在左图中是一个墙面,然而咱们没法离墙太近,由于墙面是设有空气墙的,咱们在右图中打开mesh,看到了贴图的前面的确竖着黑压压一个长方体块儿。it
下面我就演示如何在本身的地图上添加空气墙吧。io
首先第一步,添加一个 plane,这个plane要放大到足够覆盖到地图的一条边才行。form
这里须要注意一点了,你看到个人plane的mesh 是已经旋转过的了,刚开始添加的plane是平躺着的,因此须要你调整rotation 属性,来使得 你的plane “竖起来”,像一堵墙同样。接着你要关闭plane的mesh render,这样在游戏运行的时候,这个plane 的绿色mesh线就会消失,变得透明。对了,还有一点尤为是注意的,你调整rotation每每在90度,和270度的时候,均可以让它竖起来变成一堵墙,可是呢?哪个角度才行呢?答案是-要根据transform的正方向来看。你看我图中的正方向是朝着地图内侧的,这样看彷佛不太明显,看下图有个对比的,你就明白了。效率
经过找不一样你们是否发现了什么呢?对,就是那个对着地图水平面的轴,要朝向地图内侧!为何?由于当角色 从地图内侧走来的时候,若是plane mesh 的朝向不是朝着角色的,那么这个mesh 是不被渲染的,并且 collider 也不会有做用,这是direct3d那一套的默认选择,固然若是你足够牛,修改他的shader的话,实现90度和270,均可以实现碰撞的效果也是能够的~
好了,本人水平有限,就再也不讨论其余的空气墙作法了,其实用脚本写地图碰撞检测也挺快的,可是,在一张复杂的地图上,这样就显得有些乏力了,因此,你们练好用小物体填充的方式,作空气墙,对作游戏是很是实用有效的。如今已经和你们讨论了正确使用空气墙的作法了,一块儿进步吧~~~