读懂 Anne 的 Tank:追击、选敌与地形决策
结合 12 个可交互的 3D 场景,讲清 Tank 为什么连跳、换目标、在梯口减速,以及 1.x、2.0、2.1 的行为差异。
先把 Tank 的动作连成一条线
同一只 Tank,在空地上会连续起跳,到墙角却可能拐弯,到梯子前又突然降速。玩家很容易把这些变化都归结为“加了速度”或“AI 抽风”。在 Anne 的 ai_tank3 中,更有用的观察方法是依次问四件事:它选中了谁,路径准备往哪走,这一跳是否安全,接近以后准备出拳还是投石。
这篇文章面向想理解本服行为的玩家,也给排查问题的服主保留参数和源码入口。讨论范围是由 ai_tank3 控制的 AI Tank;Tank 血量、战役刷出进度、燃烧规则和不同玩法的全部改动不在这里统一定值。房间使用的模式、插件版本和实际配置,始终比“我上次在另一台服见过”更能说明问题。
怎么使用这份 3D 对照
演示左边是橙色的重构前 1.0.0.13,右边是绿色的重构后版本,可以切换 2.0 和 2.1。蓝色人物代表生还者。先选场景,再点击关键时刻,比同时盯着两个画面连续播放更容易看清:差异是出在目标选择、起跳方向,还是某个动作结束后的状态恢复。
拖动画面旋转,滚轮缩放,右键平移;手机可以单指旋转、双指缩放。俯视适合看追击路线,侧视适合看梯子、低顶和下落。两边默认同步视角,时间轴可以拖动,播放速度可选 0.25 到 2 倍。焦点不在按钮或输入框时,空格切换播放,左右方向键每次移动 0.1 秒。前两个场景还可以切换六档难度和主动左右连跳。
三个版本,分别解决了什么
| 对照版本 | 重点变化 | 观看时应注意 |
|---|---|---|
| 1.0.0.13 | 已有连跳、部分路径跟随、骑头处理和投石提前量。 | 旧版不是完全不会绕路或预测;示例聚焦它可能处理不好的分支。 |
| 2.0.0 | 把路径判断、选敌、头顶卡处理和撤离命令整理成一致的流程。 | 梯口减速、按寻路代价选敌、撤离后恢复正常行为是这一轮的重点。 |
| 2.1.0 开发快照 | 增加空中路径续接、远距离逐跳左右交替,以及安全普通下落的保速衔接。 | 没有涉及新增逻辑的场景,2.0 和 2.1 可以表现相同。 |
理解版本差异时,先区分规则和参数。路径支持直追、梯口需要让行、选敌要考虑可达性,这些属于行为规则;连跳上限、每跳推力、侧跳偏角和转向下限,属于难度参数。把难度调高,并不等于允许 Tank 穿墙、无视梯子或者取消所有安全检查。
它为什么放过近的人,去追远的人
从屏幕看距离很近,不代表从脚下能走过去。站在平台上的 A 与 Tank 只隔一小段直线,但真正的路可能要绕到另一侧找楼梯;地面上的 B 虽然更远,沿路却更容易到达。2.0 起的统一选敌器用分档寻路代价比较目标,同时沿用被控、倒地和安全屋等过滤规则。
这里的“寻路距离”是分档近似,并非每次计算全地图最短路。为了避免两个人稍微移动就让 Tank 来回转头,换目标需要明显收益,并有约 2 秒的目标粘滞。爬梯期间还会冻结目标。因此它短时间继续追原来的人,不一定是没有发现更近的目标,也可能是在维持当前追击。
看得见你,也要先确认路能这样走
2.0 起,起跳方向首先参考 NextBot 的路径快照。目标可见、处于相近高度,而且路径本身支持朝目标前进时,才允许向预测位置直追。条件不成立,就追踪路径上的可达前瞻点。透明窗口、高台边缘或隔墙看见的人,都不能仅凭视觉距离决定一条安全路线。
2.1 把这套判断延伸到了空中:约每 0.05 秒刷新目标或安全前瞻点,经过拐点后可以接上下一段。路径跟随从 1° 的小角差开始平滑修正;直追则使用对应难度的角度下限。检测频率和转向响应不是同一个数,0.3 秒的平滑响应参数不代表每 0.3 秒才看一次路。锐角、遮挡或检查预算不足时,仍可能等落地再转。
左右连跳和空中跟随,是两件事
左右连跳改变的是每跳的侧向偏角。2.1 要求目标超过 600 hu、同层可见、路径支持直追,而且这一跳不会越过梯子等特殊段。首跳左右随机,确认落地后下一跳换边,空中不会随机翻转。靠近目标、路径转弯或侧路受阻,就取消偏角,回到安全的正常追击方向。hu 是地图使用的 Hammer 距离单位。
空中跟随解决的是另一种情况:生还者在 Tank 起跳后横移,旧方向已经不合适。2.1 可以在允许的角度范围内持续平滑修正,而不是只等下一跳重定向。修正前还要验证剩余飞行路线;快照失效且又不满足直追时,会保留惯性。这不是无条件追踪,更不是能在半空任意掉头。
所以观察到近身后左右摆动消失,不代表功能失效;观察到它没有立刻跟着你折返,也不一定是反应慢。先看距离和路线,再看难度。演示前两个场景让两侧使用同档速度参数,目的是隔离转向差异,并不复刻旧版本的全部默认设置。
六档参数:哪些数决定追击感觉
下面列的是 2026-09-16 工作树中动态配置的 Tank 数值。前五档可以自动分档,音理是需要手动开启的固定档。表中的上限是配置限制,不是出生就有的速度,也不是动画测得的平均速度;地形、安全检查和模式覆盖都可能让实际速度更低。Alone 可以通过专门的覆盖项关闭 Tank 连跳。
| 难度 | 停跳距离(hu) | 连跳速度上限 | 每次落地续跳推力 | 第一跳推力比例 |
|---|---|---|---|---|
| 简单 | 220 | 500 | 40 | 0% |
| 普通 | 190 | 600 | 48 | 20% |
| 困难 | 160 | 700 | 55 | 40% |
| 专家 | 135 | 800 | 60 | 60% |
| 极限 | 120 | 800 | 65 | 80% |
| 音理 | 120 | 1000 | 65 | 100% |
停跳距离越大,最后一段越早转回正常追逐;它不是拳头的命中距离。第一跳比例只影响从跑动进入第一跳时获得多少额外推力,简单档的 0% 不等于不能起跳。落地再次起跳仍用完整推力,所以不能拿第一跳的表现判断整段追击速度。
| 难度 | 直追修正下限 | 左右连跳偏角 | 石头出手后保护(秒) |
|---|---|---|---|
| 简单 | 10° | 8° | 0 |
| 普通 | 8° | 10° | 0.05 |
| 困难 | 6° | 12° | 0.10 |
| 专家 | 5° | 15° | 0.15 |
| 极限 | 4° | 18° | 0.20 |
| 音理 | 3° | 20° | 0.25 |
六档的主动侧跳起点都为 600 hu,直追修正上限统一为 89°。角度下限越小,小幅横移越早触发修正。石头保护作用于刚出手的石头实体,AI 和玩家 Tank 都适用,并不是 Tank 本体的无敌时间;这段保护也没有在 3D 演示里做射击模拟。
窄路、低顶和梯子:停跳可能正是在正确走路
通道看上去有空隙,不代表 Tank 的碰撞体能连跳穿过。2.0 在地面起跳前已有完整路线检查;2.1 进一步检查空中改向后的剩余抛物线,包括上升段,避免只看落点却漏掉半路的墙和顶棚。侧跳候选不安全时,先退回正常方向;必要时用地面跑动通过。
梯口则是主动给原生爬梯动作让路。路径显示接下来要上梯时,会按距离提前限速,进入让行范围后停跳并压回跑速,上梯后锁定朝向和目标。反过来,如果只是经过旁边一架无关的梯子,新鲜路径快照能避免误触发;快照失效时还会回退到实体梯子检测,所以不能断言路过梯子永远不停跳。
平台边沿:为什么有时减速,有时直接跃出
2.0 对超过 56 hu 的路径下落采取较保守的限制,往往先压低起跳速度,再走到边沿自然下落。2.1 对路径明确、落差不超过 256 hu 的普通下落增加了保速衔接:按实际下层高度计算更长的腾空时间,检查完整飞行路线,并验证落点及碰撞体四角有地面支撑。检查通过才保速跃出。
这项能力不代表看见悬崖就跳。没有路径、落点不可靠、途中有墙或低顶、前方存在梯口或跳跃间隙,以及更深的落差,仍受限制。边沿也不会主动蛇形或跳砖。下落阶段沿验证过的方向保持惯性,所谓“续跳”发生在落地以后,不是空中再跳一次。演示使用 200 hu 平台,可以切换 2.0 看两种处理思路。
头顶卡位:有替代目标和只剩一人的区别
生还者在上面、Tank 在下面持续够不到时,先要区分真正不可达的卡位和正在寻找上行路线。能够通过梯子或攀爬到达的目标会获得更长观察时间,避免 Tank 刚准备上梯就被卡位处理打断。确认停滞且不可达后,有其他合格目标时,会暂时屏蔽原目标 10 秒,再交给统一选敌器挑人。
没有替代者时,处理变成撤离投石:寻找可达的撤离点,拉出必要空间,再恢复投石。2.0 的关键修正是把撤离命令的收尾统一起来,到位、超时、停滞或计划结束都要 RESET,交还正常行为控制。否则即使已经选好撤离点,也可能留在旧 MOVE 命令里持续站着。撤不开且距离允许时可原地投石,过近时不会强行投。
骑在 Tank 头上,也不等于安全
骑头和站在旁边高台上是两种情况。旧版已经能够识别骑头并尝试向上挥拳;2.0 保留正常挥拳和额外向上扫拳,在持续约 3 秒打不到时,改为原地对骑手投石,不先后撤。水平距离接近零时也有瞄准兜底,避免只适合普通远投的计算失去方向。
演示特意展示持续打不到的分支,所以你会看到计时后转为投石。如果向上挥拳能够命中,就可以继续出拳,不需要等那个时间点。把人物站到头顶当作必定成功的卡法,会忽略地图几何、判定位置和插件版本这些前提。
投石瞄的是预计位置,但仍然可能落空
投石准备动作的位置和石头真正离手的位置并不相同。2.0 在实际出手钩子中,从真实石头起点求低抛轨迹,再结合重力和飞行时间修正目标提前量。如果这次投石属于头顶卡处理中的强制计划,计划目标优先,不会临时被最近的可视目标覆盖。
提前量依赖对目标运动的估计。生还者突然折返、障碍遮挡或目标状态改变,都可能让预计位置与实际位置分开,所以“会预测”不等于“必中”。旧版同样有提前量和跳砖,变化在于出手点、弹道与目标选择的一致性。动画只示意这层关系,不提供命中率,也不能用动画石头的弧高校准实服。
把机制转成四个实战观察点
- 先确认房间:查看当前模式和 AI 档位,再判断是否套用本文参数。不要把音理、Alone 或另一台服的体验当成所有 Anne 房间的共同规则。
- 读路线,不只盯身体:看它准备从哪一侧绕墙、是否接近梯口、落差下方有没有可走的路。能迫使它重新选择路线的地形,比单纯拉长直线距离更值得关注。
- 近身时重新看目标:侧跳取消、停止连跳或短暂保持原目标,可能都是预期行为。队友应保持能互相支援的枪线,别因它暂时背对自己就挤到同一条退路上。
- 投石时看出手和落点:把掩体、移动方向与队友位置一起考虑。预测弹道会追预计位置,但突然变向是否有效仍受距离和地形影响,别把演示里的躲法当成保证。
这些观察点帮助你解释一次交战,而不是给出万能站位。队伍是否还能互相救援、退路是否被普通感染者堵住、是否有人被控,通常比单独研究一条连跳轨迹更急迫。需要战斗分工和 Boss 进度的入门说明,可以继续看下面的 Tank 与 Witch 文章。
觉得行为异常时,怎样留下一份有用的记录
先记录地图、地点、玩法、AI 档位、插件版本,以及当时每个生还者的大致位置。录像尽量保留异常动作前后的完整过程:起跳前有没有看见目标、是否刚经过梯子或边沿、换目标前是否已经停滞、撤离后有没有恢复追逐。只截最后一帧“它站着不动”,很难区分安全让行、没有可达路线和真正的状态残留。
反馈时可以附上最接近的演示场景,但要说明实服与示意的不同:比如不是 200 hu 平台、头顶还有低顶,或者路径并不通向落点。演示路径是手工给定的参考线,人物为便于观察而放大,标签也不受地形遮挡;前两个场景使用固定 0.773 秒滞空的简化计算,其余场景以关键帧说明状态转换。真正的排查仍要回到地图 nav、碰撞和服务端日志。
版本依据与后续核对
本文与站内演示一起冻结了一个可复查的说明版本:1.x 对照基线为 c6b201e14^,2.0 为 c6b201e14,2.1 为 2026-09-16 开发工作树。后续插件继续演进时,应同时核对场景说明、动态配置和本文参数。开发快照能解释新增设计,但不能证明当前某个房间运行的就是这份代码。
- 路径与移动
- ai_tank3/path.inc、movement.inc:路径前瞻、特殊段、地面连跳、空中修正和下落路线检查。
- 选敌与卡位处理
- ai_tank3/target.inc、overhead.inc、command.inc:统一选敌、骑头与头顶卡判定、撤离计划和命令复位。
- 攻击与难度
- ai_tank3/combat.inc 与 configs/AnneHappy/dynamic_ai_difficulty.cfg:出手点、低抛提前量、攻击约束和六档行为参数。