1.3.4 墙体和动态阻挡

场景内的墙体阻挡及其对角色移动的限制是MOBA类游戏的核心机制和体验之一。阻挡的几何形状及与移动、技能的交互逻辑通常都较为复杂,部分玩法和英雄技能还允许玩家实时创建多种类型的动态阻挡;因此,在预表现计算中也需要正确处理阻挡交互逻辑。

本方案在实现时借鉴ECS(Entity Component System)思想[1],抽象出专门的物理层组件对象Entity,作为游戏角色(Actor)持有的组件(Component);Entity维护角色的位置、形状、移动类型等与移动、阻挡相关的数据信息,并负责处理角色的所有移动、碰撞逻辑。Actor的其他逻辑组件均借助Entity进行移动阻挡的计算,本身不再维护任何移动数据及状态。

同时,本方案将Entity的移动、阻挡逻辑归纳为一系列无数据状态的游戏系统(System)调用,如寻路移动、墙体检测等。这些系统本身不存储任何数据状态,在计算调用中不会影响和修改任何其他的逻辑数据,而是返回计算结果供调用方自行修改逻辑数据。

以角色的方向移动为例,调用方提供角色的移动朝向、距离、当前位置等数据,由寻路移动系统依据导航网格和阻挡计算出移动终点、朝向等信息作为结果数据返回。调用方接收到返回结果后,依据其他逻辑条件,执行角色坐标设置等逻辑修改。其代码调用流程大致如下:

这样,预表现更新和游戏逻辑更新可以执行完全相同的计算逻辑,从而尽可能避免两者预测结果的偏差,同时不会有帧同步模式下各客户端逻辑不同步的风险。

当然,由于操作命令延迟和丢包、渲染更新与逻辑更新间隔不同等原因,预表现与游戏逻辑模拟结果总会有有偏差的时候。大部分偏差可由前述的位置修正策略逐步调整,但对于影响后续移动计算的关键错误,需要定期检测并在确认时立刻将表现位置同步到预测的最终逻辑位置;例如,预表现正常移动但实际逻辑执行时因产生动态阻挡而导致移动被卡住或变向。