1. 前言
最近在做项目的过程中,由于项目简化,多处使用了单面模型,导致之前不得不面对的碰撞问题又重新浮现。
之前的解决方案是直接在模型法线朝向的另一边加一堵空气墙,防止玩家穿模。但效率其低,且不容易维护。
之后由于模型法线翻转,面数又过多,导致加空气墙的方法已经跟不上项目的发展,又想出一种解决方案。把单面模型加简单碰撞(使用Convex Decompo),不用其自身的复杂碰撞。
最后的解决方案我都没想到这么简单,只要在单面模型中把Double Sided Geometry勾选上,并设置为复杂碰撞(Use Complex Collision As Simple)就可以了。
2. 基础知识
关于单面模型法线的问题,就是法线朝向你的那面会有碰撞,另一面没有。这个有时就会发生很有趣的问题,举个栗子:把一根柱子的法线反转,使其法线朝向内部,会发生什么情况。后果就是玩家跑向柱子的时候可以进入柱子内部,但由于法线是朝向内部的,所以玩家出不来了,被困在柱子内部,形成困兽之斗。
下面举个具体栗子:
上面这个单面模型黑色部分就是法线反转的部分,没有碰撞。具体看下模型反面图片就知道了。
可以清楚看到上面白色部分与之对应的反面是黑色部分的,即无碰撞部分。
打开单面模型一下,哦~原来只有白色部分才有显示,即有碰撞部分。
了解完基础知识后,下面举一下上面三种解决做法的具体栗子。
3. 具体例子
1.使用复杂碰撞,外加空气墙。空气墙的做法就是加一块板,然后把visibles设为false.一般适用于简单场景。
2.把所有的单面模型使用简单碰撞,再用Convex Decompo生成简单碰撞。适用于单面模型不多的场景。
3.在单面模型中把Double Sided Geometry勾选上,并设置为复杂碰撞(Use Complex Collision As Simple)。运用此方法的过程中,你可以先将使用场景的模型合并成一个Actor(当然是指没有写逻辑功能的场景模型),然后再勾选。十分方便,其中关于Double Sided Geometry,其如果为真的话,执行场景查询时物理三角形网格体将使用两侧面。适用于需要两侧皆有检测的平面和单侧网格体。
至此,单面模型穿模和法线问题解决,可以愉快的去写逻辑代码咯~若有不足之处,请多多包涵并指正。也欢迎行业的大佬多多指点。