掩体系统(下)
上一章介绍了掩体系统在离线/运行时的场景掩体点生成算法流程。本章主要介绍掩体在运行时的交互逻辑流程。
运行时交互
由于不同体型,不同角色速度角度或者别的参数的情况下掩体生成阶段无法抉择,运行时的判断是必须的
掩体过矮、过窄、坡度过陡、转角角度过大都被认为不能进入的掩体
掩体点过滤和择优
我们上一章节介绍了根据场景Navmesh生成的掩体点。掩体点粗略代表了此位置是可以进入的掩体位置。但是这个位置掩体点是否是可以真正交互的,也需要做掩体点的过滤和择优。
过滤公式如下:
将掩体点选择到可用池中,其中Range为传入范围参数,Block为掩体法线击中点,CharPt为角色位置,CoverPt为掩体点位置,Input为输入方向,Camera为摄像机方向,Normal为掩体点法线。
而择优则是采用打分机制,公式如下:
高度检测
对于不同高度的掩体,其交互效果的逻辑也不一样,高度检测也是必须实现的逻辑。对掩体高度检测能过滤掉不合法掩体的同时,还能实现高低掩体的切换功能。
高度检测算法流程:通过BoxTrace水平检测,从下往上迭代数次,获取最后一次的击中Trace,并获取击中的点,与角色立足点的Z轴相减,则可以获得掩体高度。
有时候击中点高度不是那么准确,可以优化为:从最后的一次非击中Trace的起始点和终点所为线段,与上次击中Trace的点(可能高度不对)与掩体法线所谓平面相交,求得焦点并修正Z为起始点Z,向下Trace得到的击中点必然为Z轴准确点
使用BoxTrace实现检测掩体高度(左)以及对应的DebugDraw(右)
转角检测
转角检测用于判断角色能否连续移动到转角掩体。
算法流程是:从角色Y朝向(左右方向)两个对象方向移动一定距离(EdgeMaxDistance),旋转90°朝X方向(正对方向)发出射线,此时如果击中则可计算转角角度(EdgeAngle),否则继续从端点发出射线,击中下一个障碍,如果击中,法线与当前射线向量则为夹脚,否则视为无转角(90度)。
值得注意的是,初始射线检测的长度必须小于设定掩体边缘参数,否则检测结果是无效的。
掩体角色的交互状态机
为让整个交互过程清晰,状态机处理流程是一个好办法。状态流程具体还分为左右肩进入,高低掩体进入和切换,掩体起步、移动、转身、探身等。
总结
实际上掩体系统逻辑的复杂度还远不如上述,其包含掩体探身(探身射击)、掩体盲射,快速掩体进入(掩体滑铲进、掩体翻滚进入,掩体跳跃进入)等。各个逻辑模块也不算复杂,不过实际做法也大同小异。掩体系统的核心和本质是角色跟场景的交互,或者说是检测算法与碰撞的反馈。Gameplay系统其中一个重要本质是让玩家做到尽可能少且直觉的操作或输入,然后系统能经过复杂但合理的处理后输出有趣且多种多样反馈,掩体系统理论上应该做到如此。