导航动作交接
全库目录221
本文目录10
寻路完成后,候选走廊还要通过版本检查,取得移动器,处理到达后的站位保持,并在失效时释放控制权。本文跟踪半径0.4米的守卫:门D在查询Q7时开启为版本8,门关闭后变为版本9。目标几何见导航目标投影,路线求值见路径跟随,动作身份与计划归属见游戏AI决策模型。
查询快照与采用
异步搜索持有不可变导航快照,保存角色实例与体型配置版本、区域代价和过滤规则版本、起终点投影、目标对象及参考系身份,以及逻辑请求ID、尝试号和运行纪元。静态瓦片的生成记录保存源几何与完整祖先变换版本;移动支撑的生成记录保存NavMesh定义的形状及尺度版本,另附本次查询所用的姿态与运动版本。父缩放即使没有改变对象局部位置,也会使烘焙输入失效;刚体支撑按既定运动继续推进时则重算世界位置、坡度与连接,不为每个姿态重复烘焙。
烘焙输入变更与受影响区域的待更新标记在同一宿主提交中生效,随后重建瓦片;新瓦片只在源版本仍匹配时提交并更新代次。重建期间,查询、候选采用和路线跟随都拒绝将这些旧瓦片作为当前可行走空间。运动预测变化只废弃本步候选并从当前反馈重算;支撑消失、坡度不再合法或连接失效则使相应路线段失效。
瓦片和邻接引用都属于这份快照,查询完成或取消确认以前保留其存储。工作线程返回迟到结果时,即使消费者已拒绝采用,仍由工作线程的完成回执释放快照引用;“不采用”不能直接回收仍在读取的旧瓦片。
返回值给出走廊及读取依赖:搜索实际读取的瓦片ID和代次(另标出路线经过项)、门与网格外连接状态版本、投影使用的目标版本、体型与过滤配置。消费者先核对当前请求ID、尝试号和纪元,再在导航更新的同一提交入口核对这份集合,再登记采用或拒绝。移动支撑上的路线保存局部门户和所属对象,在实际采用时转换坐标并重验起终点接入、世界坡度和跨支撑连接;查询时的世界坐标只用于解释该次搜索。只比较终点多边形或单个全局版本,都不足以证明中间门与目标仍有效。区域代价改变虽不一定使路线穿墙,也可能改变最优路线;本例严格拒绝代价版本失配,重新查询。未被读取的无关瓦片更新则允许保留候选。
守卫查询Q7时门D开启为版本8,结果完成前门关闭为版本9。采用检查拒绝Q7,并基于新事实登记Q8;旧Q7的成功只代表旧快照可达。若门未变而掩体由位置a移到b,目标变换版本同样使Q7失效。重新计算起终点与走廊属于新请求,不能修改Q7载荷后沿用它的身份。
采用提交只证明该边界的输入一致。候选等待旧移动取消时,守卫可能被平台搬运;真正启动还要重新投影实际位置、核对路线依赖并确认移动资源已经释放。提交启动与核对使用同一控制器接纳入口,避免检查之后、接纳之前门又变化。已经开始跟随的路线继续观察依赖失效和碰撞反馈,启动检查不能保证未来门始终开启。
查询命令与采用结果写入游戏AI决策模型所述的出站表和有序日志。已登记未派发的Q7,在确认没有已提交结果后,以原逻辑ID、同一参数和新纪元递增尝试号续行;纯查询不持有移动器,其派发去重键是逻辑ID与尝试号的组合。重放模式直接读取已采用走廊、依赖与决定,不重新竞争后台完成次序。恢复记录先提交Q7旧尝试到新尝试的变更,再开放派发;第二次恢复先顺序消费这份记录,再消费新尝试的结果。已被Q8替代的Q7保留为过期项,即使重查成功也不能重新变成活动请求。对未完成搜索本身无需恢复堆和展开顺序,但采用记录必须保存足够的走廊几何与依赖,不能只保存即将释放的快照指针。
Q7或Q8提供的是多边形序列。守卫的身体仍不能直接跟着多边形中心连线行走,路径跟随把相邻多边形的公共边变成转向约束。
控制器反馈与动作交接
组合AI中,行为树移动叶登记一次移动命令,候选导航查询归属模式与计划代次,采用后的走廊和跟随器归属该叶的动作实例。模式退出等待该叶及模式持续持有的保持实例分别结清。跟随器只返回到达、失败或取消进度,不直接进入另一个模式,也不自行启动替代移动实例。路线失效由决策调度器消费后选择目标;纯查询可以提前计算,新的移动仍由活动叶登记。
跟随器保存导航版本、当前门户索引、下一个拐点与动作请求代次。前视距离沿路径累计,而不是从角色到后面任一点直接取欧氏距离;前视段必须留在有效走廊,避免越过凹角穿墙。先由路线速度表与停止距离生成首选速度,再把走廊、最大速度和加速度约束交给避障,最后把得到的运动请求送入控制器。不能先求安全速度再随意做加速度限幅,因为限幅可能把结果拉回禁区。
控制器返回实际位置、实际位移和阻塞原因,跟随器据实际位置更新门户进度。只有实际跨过当前门户且仍在相邻有效多边形中才推进索引,不能按期望速度积分出“已到下一段”。被碰撞截断后,按移动支撑与速度反馈的反馈取得接触求解后的vEnd,并从实际位置重新投影到当前走廊段。当前路线若仍要求向阻挡法线内运动,将该障碍加入下一步局部边界或等待状态,不能连续输出同一个顶墙请求直到超时。到终点的距离小于位置容差且实际速度低于停止阈值,且请求的停止参考系仍有效,才向行为层报告到达;部分路径报告“到达部分终点、原目标不可达”。连续例如0.5秒请求非零但实际进度不足0.05米时进入阻塞状态,先等待预约或局部重规划,不重复报告成功。
到达、部分终点和阻塞分别交给移动叶处理。对交互目标,实际位置还要位于原目标允许站位内,支撑层、接近侧、朝向、交互距离与射线均成立,目标版本仍匹配;相对目标参考系的完整步末速度进入停止阈值并完成移动控制权交接以后,这些检查与终态在宿主共同版本入口提交,才返回Success。普通位置目标使用其位置与停止容差。
站位保持与位置纠偏
固定目标位于移动支撑旁时,到达后仍可能需要主动抵消搬运。移动请求接纳时保存保持策略、模式实例及目标站位,并预留保持容量。到达提交把移动器从原移动实例转给模式持有的保持实例,同时写入原移动Success、保持记录和站位事实。保持实例ID由原动作ID与交接步骤ID派生,重复提交返回同一结果。原叶结束的是这次移动;模式继续持有保持责任。独立状态机配置由活动状态上下文承担同样的保持责任。静态地面且允许被动站立时直接释放移动器,事实仍由实际姿态监测。没有保持容量且当前站位需要主动维持时,原移动保持Running或明确失败。
保持目标保存目标参考系内的脚点与朝向。每步用当前目标变换计算世界目标q及该点世界速度wTarget,再取得实际脚点x、支撑及步末速度。目标几何与局部槽版本固定,连续运动由单独的参考系运动记录推进;预测更新重算本步曲线,目标替换、传送或槽变更使旧保持失效。
令dVec为q-x的水平投影,d为其长度。首选水平世界速度由目标搬运与纠偏相加:wPreferred=projectHorizontal(wTarget)+normalize(dVec)*c,其中c=min(Kp*d, correctionCap, sqrt(2*a*max(d-positionDeadband,0)));d为零时纠偏项为零。Kp使用秒的倒数,a为可用纠偏制动预算,positionDeadband为允许的静止误差。这个速度只提出返回目标的方向和上限,实际相对水平速度先减去支撑水平速度,再经过同一坡面映射、加速度约束、走廊边界和连续扫掠。竖直分量由支撑接触求解,目标高度与当前支撑不兼容就使站位失效。朝向按目标参考系更新,并受角色角速度与角加速度限制。
例如固定世界目标X=0,传送带u=1,角色原相对速度-1。外力将角色推到X=0.03后又恢复零世界速度,若只补偿搬运,它会一直停在X=0.03。取Kp=2、correctionCap=0.2、a=0.6、positionDeadband=0.005,纠偏首选世界速度为-0.06米/秒,相对首选为-1.06。相对速度上限1.2、dt=0.1时,加速度圆允许从-1到-1.06;连续加速的世界位移为-0.003米,实际到X=0.027。下一步读取这个实际位置继续求解,不能直接写回X=0。若上限只有1,角色无法产生向左的世界纠偏速度,系统记录保持能力不足;“能抵消搬运”并不等于“能恢复位置”。
保持策略为本例保存位置进入阈值0.01米、退出阈值0.02米和速度阈值0.01米/秒。初次建立事实要求误差与完整相对目标速度都进入阈值,并通过实际交互检查。保持中超过退出阈值、支撑失效或交互条件失败,在同一宿主提交中使站位事实失效并进入Recovering;原移动的历史Success保持不变。上例0.03米推挤因此立即禁止新的交互副作用,原手部动作进入中止。返回进入阈值、停稳且姿态重验通过后,保持器生成新的事实代次;已中止的手部动作由决策重新选择,不自行恢复。
首次进入Recovering保存当前Tick加30的截止值,每个物理步继续从实际反馈纠偏,重复唤醒和进程恢复不延长截止。无安全曲线时执行可验证制动并报告原因;无纠偏能力或到期仍不能恢复时,保持器进入失败清理,事实保持无效。上述恒速传送带数例取一个逻辑Tick等于0.1秒、无其他约束,逐步积分在第9步到X约0.003886米且世界速度归零,才重新建立站位事实。平台旋转与加速仍消费移动支撑与速度反馈的完整世界曲线和接触结果。
保持所有权与模式交接
保持记录绑定模式实例、原移动命令、保持实例、目标读集与事实代次。手部交互可以使用另一独占资源并与保持并行,但接纳及每次实际副作用都核对站位事实代次与姿态;事实已失效就禁止继续接触、射击或操作。它先完成自己所需的回收与资源清理,再向模式返回终态。
模式退出时先使站位事实失效,停止新手部命令,等待活动交互清理,再按保持实例ID登记幂等取消。保持器沿当前有效支撑与边界执行安全退出,确认原实例不再拥有移动器后返回终态;需要转为支撑相对静止时保存这次停止参考系,不能仍把固定目标的零世界速度当作退出完成。停止或释放不能确认时保持退出中,后继移动不取得资源。释放后的实际身体由物理系统继续推进,下一动作使用新的实际位置、速度与支撑。
同模式的后继动作需要移动器时也先结束保持,再接纳新动作。宿主在同一入口核对旧所有者及代次、保持取消回执和新动作前提,才替换资源归属。已完成移动命令的取消只返回原终态;取消保持使用独立的保持实例ID与取消命令ID。旧移动或保持的迟到通知都不能清空新所有者。保持失败先使依赖事实失效,再经原模式的计划终态规则选择重规划或退出。
快照共同保存保持实例、模式归属、资源所有者、停止参考对象、事实代次、Recovering截止和实际反馈。恢复先重建世界及宿主账本,核对保持读集与当前能力,再恢复保持控制;在此以前,依赖它的交互及Satisfied事实均不可用。保持已取消或模式已退出,就消费原终态并清理,不因历史移动Success重建保持。再次中断仍读取同一保持身份和恢复决定,恢复顺序见游戏AI决策模型。
路线失效与取消
已到站位但仍在转身时保持Running,按角速度限制完成朝向并重验;持续遮挡、距离或身体条件失败时,停止并释放资源后返回Failure及具体条件,决策层可以选择其他站位。目标版本失配按路线失效进入取消,不在旧命令内改写目标。仅到达部分路径终点,或预约等待超过本次请求保存的截止Tick时,同样先完成制动与资源释放,再返回Failure。许可等待时间内保持Running,超时沿同一失败路径退出,不新建同一移动请求。模式退出导致的中止返回Cancelled;路线失效而没有模式退出请求时,Cancelled由上层按原目标重新选择或重规划。根终态到同模式新计划、Satisfied和HFSM退出的具体推进见游戏AI决策模型。
门或破坏使走廊失效时,跟随器立即停止给旧路线派发新的移动目标、使旧门户引用失效,并把已发动作置为取消中。失效路径绕过行为层的普通切换迟滞,但取消请求不等于移动资源已经释放。控制器继续处理制动、落地或网格外连接的安全退出,直到返回释放资源的终态;重复中止返回同一取消记录,超时保持取消中并进入故障处理,不让新动作同时取得移动控制权。四态动作交接见游戏AI决策模型。
取消期间可以从实际位置并行计算候选路径。结果返回时先核对请求代次与导航版本;真正启动时再检查当前实际位置仍能接入起始多边形、整条路线版本仍有效,且旧动作已经释放资源。角色在取消期间被平台带走时,需要重接或重新寻路,不能从过期起点启动。网格外连接同样是有终态的动作:只有到达目标端并确认落地才能推进门户;取消或失败保留当前实际位置,重新接入导航。旧请求的迟到成功只用于完成其资源清理,不覆盖新路线。
调试与边界
导航调试至少要能显示可行走区域、区域代价、门户边、全局路径、局部速度、邻居集合和阻塞原因。一次寻路成功不等于角色最终可达,还要验证电梯、门、跳跃动画、动态障碍和目标移动。
恢复存档时先按同一日志前沿恢复世界实际姿态、速度、门状态、采用走廊与控制器执行账本。移动命令已提交但未接纳时,恢复出站表;已接纳但回执未消费时,核对原实例;已到达并提交位置效果时,恢复效果并消费原终态,不再次移动。新运行纪元承接原命令与动作ID,只有重新生成的导航查询采用新尝试号;不能一概生成新的移动代次来绕过旧动作的所有权。
保存的门户索引只是恢复候选。核对导航读取集并按原支撑层、侧别和纠偏上限重新投影实际位置以后,才确认能继续原走廊;任一必要依赖失配就登记路线失效和取消命令,等待原实例释放,再接纳新路线。坡面地块与梯度按恢复后的支撑面重建,由有效的世界步末速度减去当前支撑接触点速度,再投影得到vEnd并重建速度表;目标站位与交互检查沿原目标版本重验。旧梯度、旧投影点都不能直接控制恢复后的身体。跳跃、电梯由控制器恢复原动作阶段和资源所有者,或执行日志中选定的安全退出,完成以前不派发普通跟随。恢复期间再次退出,先消费上次恢复记录、取消与回执,再决定剩余工作;存档前的旧纪元消息只用于持久账本对账,不能覆盖恢复后的路线。这里的推进对象始终是同一守卫的实际姿态,而不是保存的期望路径距离。
性能上把请求分帧调度并设置扩展节点预算。对大量单位可缓存共享路径走廊,但每个角色仍保留局部避障。若最终表现异常,应先判断错误属于世界表示、全局搜索、路径平滑、运动控制还是动画同步,不要把所有问题都归为“NavMesh 有问题”。
验证方法
让门D从版本8变9,确认Q7候选被拒;把固定站位推开0.03米,确认先使站位事实失效,再经实际纠偏恢复新代次。分别在查询返回、移动接纳、保持交接和取消回执前中断,核对身份、资源所有者与截止时间。
实现与证据
查询采用、站位保持、资源交接与恢复是本文定义的宿主协议。传送带保持数例按0.1秒逐步积分复算;几何、避障和连续曲线的来源与推导见对应专题。尚未运行异步导航宿主或完整保持控制器,协议推演不代表目标引擎运行通过。
相关主题
参考资料
本文的几何、运动与宿主协议按所列公式和数例定义;整体来源与关联机制见游戏AI导航。