做动作手游一定会用到碰撞,没做过的人可能会觉得碰撞挺复杂的,其实动作游戏的碰撞很简单,甚至比雷霆战机这种休闲游戏还要简单,难可能是难在打击/受击的节奏感上,技术只能提供一个灵活可配置的战斗系统,具体参数怎么配置怎么调,节奏的把控就要看美术和产品了。
如果是做像时空猎人,王者之剑,三国(乱世)之刃这类横版2D动作游戏,碰撞可能只需要两个矩形:攻击包围盒和受击包围盒。
每个场景中的角色都有一个受击包围盒,大小基本上能包裹住人物的身体部分。如果不是对身体的受击部位有特殊要求,一个矩形的受击包围盒就可以了。如果需要判断受击的部位,那可以根据部位拆分成多个矩形。如果打击要做的很精确,可以根据角色的骨骼来划分成多个矩形,不过这就意味着碰撞运算会增多,对动作手游来说不是很必要。反而是像雷霆战机这种弹幕类游戏才需要更精确的碰撞,飞机需要按骨骼拆分,因为如果飞机整体外形是凹多边形,用矩形包裹它会出现子弹看起来没打中飞机但还是会误判成命中。
每个场景中的角色都会有一个攻击包围盒。这个盒子的大小可以根据角色所持有的武器或者所释放的技能而变化。当角色处于非攻击状态时,攻击盒是disable的,不需要做任何碰撞判断。角色的每个攻击动画都需要有一个配置,这个配置中会包含一个事件序列,当动画播放到某个时间点时指定的事件就会被触发。这里和攻击盒相关的事件就是攻击事件,当攻击事件触发时,攻击盒才会enable,才会和场景中的受击盒进行碰撞。矩形的碰撞本身是简单的,使用Box2d之类的物理引擎或者自己做AABB的碰撞检测。攻击事件可以是瞬时的,就是在事件触发的那一帧完成碰撞的检测,过了这一帧攻击盒子就回到disable状态了。 也可以是有一个短暂的持续时间的,这个时间的设定取决于动作, 过了这个持续时间,攻击盒子就再次回到disable状态。后者的好处是碰撞会更真实一些,如果角色挥舞大剑的动画持续了0.2秒,那么在这0.2秒内进入碰撞区的玩家都会被击中,不过要注意只能击中一次,而不是每帧击中一次。
如果角色是远程单位,例如弓箭手或法师,那需要为他们攻击时的发射物创建一个独立的攻击盒子,这个盒子随着发射物移动并做碰撞检查。
3D游戏的碰撞会复杂一些,不过好在u3d有方便好用的物理引擎。攻击盒子受击盒子的原理和2D游戏是一样,只不过把矩形换成长方体和胶囊体。除此之外,3D中增加了角色和场景的碰撞。u3d的物理碰撞是分层的,可以在Edit->ProjectSettings->Physics里面设置碰撞分层矩阵。通过分层,人物的攻击盒子就不会与地面或者角色本身发生碰撞而产生奇怪的效果。