2.1.2 运行时处理
视野的运行时部分需要动态计算以更新阵营网格的可见性,总体来说可以分为探索源收集、根据探索源更新阵营可见性网格、视野残留衰减这几部分。MOBA类游戏多以阵营为单位,并且视野阵营共享,因此视野网格是根据对局阵营数量来创建的。从阵营视角出发,运行时的基本流程如图2.10所示,其中阵营可见性网格数组与网格视场遮罩使用了离线流程中序列化后的数据。阵营可见性数组描述了整个场景视野网格对某个阵营的可见性,因此它应和场景视野网格数量一致,阵营视野的更新与维护都是对它进行修改,它是阵营视野共享特性的关键数据,同阵营的角色使用同一份数据,并且角色A是否能被阵营B看见是根据阵营B视野网格数据中是否可见角色A的网格坐标所决定的。因此,阵营可见性数组的结构实现了阵营视野共享的特性。
图2.10 运行时流程图
探索源收集也是以阵营为单位进行的,所谓探索源是指具有视野功能的英雄、小兵、怪物、召唤物、子弹等对象。在更新阵营可见性数组之前需要对阵营有效的探索源进行收集,过滤掉死亡等无法再进行视野探索的对象,当然也可以实现死亡后加入探索源继续探索机制,总之,这一步要根据具体业务需求来进行过滤筛选。
更新目标探索源在阵营可见性数组中的数据时,需要使用探索源的视野范围图。如图2.11所示,MOBA类游戏中的视野范围一般为圆形,浅色区域为探索源可见区域,深色区域为不可见区域,视野范围图描述了探索源的视野大小与可见区域。文中所述的视野范围图是动态生成的,之所以是动态生成的,主要原因是一些技能、关卡机制能够改变探索源的视野范围,例如,致盲技能、视野成长道具等。
图2.11 探索范围
阵营可见性数组更新是运行时最为核心的一环,数据的更新也是以阵营为单位的,主要有以下步骤:
(1)依次遍历阵营的每个探索源。
(2)根据探索源所在网格,获取对应网格由预处理阶段生成的视场遮罩。
(3)获取探索源运行时生成的视野范围图。
(4)将视野范围图与视场遮罩进行与运算(AND Operation),求出最终可见性视野范围,如图2.12所示。
(5)最后将求出的数据存入阵营视野数组中探索源所在的对应网格位置,从而实现阵营视野可见性数组的更新计算。整个流程的简化代码如下所示:
图2.12 可见视野范围计算
视野计算流程中经常涉及世界场景与视野网格的坐标、索引相互转换的情况。对于连续存储的网格视野方案能够简单快速地进行转换。假设整个视野网格在场景中的起点为,网格数量为,每个网格的边长为,那么可以得出以下常用的转换公式。
● 世界坐标所在的网格索引:
● 网格索引转世界坐标:
● 网格索引转索引偏移和:
式中根据世界坐标计算索引偏移时使用了向下取整,在许多编程语言中(如C#、C++),整型数除法会进行截断从而自动实现正数向下取整。
视野残留是MOBA类游戏常用的特性,探索源经过的区域还能短时有效地提供视野,提供视野的能力会随时间缓慢消失。这种机制能够暂时增加已探索区域的确定性,增加特定方向的安全感,也能暴露跟随得过于接近的敌方,从而进一步增加了视野探索、主动获取信息的重要性与对抗多样性。视野残留是通过对阵营可见性数组的衰减来实现的,阵营可见性数组中实际保存的为点亮时长,使用8位数据已足够表示残留时长。探索源最终可见视野范围对阵营可见性数组的赋值,其实是刷新可见区域网格所记录的点亮数值,而在主循环中会不断对可见性数组点亮数值进行衰减,对应网格点亮数值衰减至0则变为不可见网格,从而实现了视野残留机制。图2.13展示了一个在周围没有视野阻挡情况下匀速移动的探索源实际的可见区域,它的实际可见区域是一个胶囊体,剩余视野持续时长用颜色深浅标识,最深处为目前探索源正在点亮的圆形区域,单方向依次递减,如图2.13的左图所示,具体网格点亮数据如图2.13的右图所示。
图2.13 视野残留衰减