▒ 目录 ▒
- 从《影之刃零》制作人访谈看游戏 AI:攻击欲望、反应延迟与难度设计
- 1️⃣ 把“难度”拆成几个能调试的问题
- 2️⃣ 反应延迟应当作用于决策信息
- 3️⃣ 攻击欲望需要一个明确的触发规则
- 4️⃣ 群战还需要协调谁先出手
- 5️⃣ 一段最小决策伪代码
- 6️⃣ 怎么判断调参是否有效
- 7️⃣ 给玩家留下可以理解的应对机会
- 📖 参考资料
从《影之刃零》制作人访谈看游戏 AI:攻击欲望、反应延迟与难度设计
同一个 BOSS,怎么让刚上手的玩家打得过,又让熟练玩家觉得有挑战?
血量和伤害很容易进入配置表。但如果敌人的招式、节奏和应对方式完全一样,提高数值也可能只是把一场战斗拖得更长,把每次失误变得更贵。
《影之刃零》制作人梁其伟在 AUTOMATON 的采访中谈到,简单难度会调整敌人的进攻积极性和反应速度,并希望玩家依然能体验完整的交锋。这给开发者提供了一个值得讨论的切入点:除了改数值,还能调整敌人给玩家留下的行动空间。采访原文
下文的参数、流程与伪代码是独立的教学设计,不是《影之刃零》的源码、实测数据或内部架构披露。这里的游戏 AI 指敌人行为控制,不预设使用机器学习。
《影之刃零》官方展示画面。图片来源:PlayStation 游戏页面,游戏开发商 S-GAME。用于呈现战斗场景,不代表本文教学参数的实测效果。
1️⃣ 把“难度”拆成几个能调试的问题
先考虑一个最小战斗场景:玩家与敌人近身对峙,敌人可以接近、等待、攻击和恢复。暂时不做复杂连招,先回答三个问题。
敌人多久主动发起一次攻击?玩家改变位置后,敌人多久才据此作出新决策?多个敌人同时在场时,允许多少个一起进攻?
这些变量影响的是不同的体验。第一项决定压力是否持续;第二项影响敌人的应对是否及时;第三项决定玩家是否需要同时处理多个方向的威胁。把它们全部压成一个“难度倍率”,很难知道玩家究竟被什么难住了。
下面这组数值只用于说明调参方向,不能直接当作可用的平衡方案:
| 参数 | 练习档示例 | 挑战档示例 | 需要观察的体验 |
|---|---|---|---|
| 新观察生效延迟 | 0.45 秒 | 0.20 秒 | 玩家变招后,敌人是否过早应对 |
| 攻击结束后的最短等待 | 1.20 秒 | 0.60 秒 | 玩家是否有恢复和反击机会 |
| 群战最大进攻人数 | 1 人 | 2 人 | 不同方向的威胁是否还能辨认 |
这里刻意没有同时修改血量和伤害。第一轮实验只改行为参数,比较容易判断变化来自哪里。真正制作游戏时,还要结合攻击距离、动作时长、场地和玩家能力重新确定数值。
2️⃣ 反应延迟应当作用于决策信息
假设玩家在时间 t 向左闪避。如果敌人在同一次更新里立即利用这个结果切换成最优追击,玩家可能觉得自己的选择没有意义。
一个适合教学的处理方法是:保存带时间戳的观察,等它足够“旧”以后,才允许决策系统使用它。这样限制的是敌人获取新信息并采取行动的速度,而不是把整套攻击动画播放得更慢。
两者差别很大。减慢动画会改变攻击前摇、命中时间和观感;延迟决策则可以保留原有动作的速度,只让敌人稍晚开始应对新的局势。
但延迟也不是越大越好。如果敌人长期根据过期位置追击,会像在攻击空气。因此,行为选择可以使用延迟观察,移动碰撞、导航安全等底层约束仍需及时处理。不同信息不必采用同一个更新策略。
3️⃣ 攻击欲望需要一个明确的触发规则
“更积极”不能只停留在策划描述里。对最小原型,可以先用攻击结束后的等待时间表示:敌人完成一次攻击并恢复后,至少等待一段时间,再允许下一次进攻。
这是一种简化表达,攻击欲望还可能由距离、资源、受击情况和战术目标共同决定。原型阶段先把一个因素做清楚,比一开始叠加许多随机权重更容易调试。
尤其要小心逐帧随机。例如每次更新都执行“10% 概率攻击”,在更新频率变化时,每秒得到的判定机会也会变化。若要引入随机等待,可以在进入等待状态时抽取一次时间,然后按经过的秒数倒计时;固定频率的决策更新也是一种可选办法。
4️⃣ 群战还需要协调谁先出手
把单个敌人调得很克制,不代表五个这样的敌人围上来仍然合适。
可以在教学原型里加入一个共享的进攻名额管理器:敌人准备攻击前申请名额;拿到名额才能开始;攻击完成或被打断后归还。没有名额的敌人继续移动、观察或摆架势。
这个方法控制的是同时进攻的人数,不会自动解决所有群战问题。两次攻击即使都符合人数上限,也可能在很短时间内接连命中;屏幕外敌人的攻击也可能缺乏提示。还需要观察攻击之间的时间间隔、镜头可见性,以及玩家是否有足够的逃离空间。
5️⃣ 一段最小决策伪代码
下面只展示决策顺序。它省略了寻路、动画、命中检测和事件队列,也不对应任何特定引擎 API。
进入战斗(now): next_attack_time = now 清空历史观察;初始化为未持有进攻名额 每次更新(now): 记录当前可感知的战场信息及时间戳 observation = 取时间不晚于 now - reaction_delay 的最新观察 如果当前动作尚未结束: 继续执行已承诺的动作 返回 如果没有可用观察: 等待 返回 如果 observation 中目标不在攻击范围: 根据观察选择接近目标,移动仍遵守实时碰撞约束 返回 如果 now < next_attack_time: 保持距离或等待 返回 如果共享管理器未能原子地分配进攻名额: 调整站位 返回 开始攻击并标记持有名额 攻击与恢复阶段结束,或动作被打断(now): 如果持有名额: 释放名额并清除持有标记 next_attack_time = now + attack_rest 退出战斗或死亡: 如果持有名额: 释放名额并清除持有标记这里有两个容易漏掉的细节。
第一,这里的“攻击结束”包括动作恢复阶段;等待时间从完整攻击动作结束或中断时开始计算。如果从攻击开始时计算,长动画可能吃掉全部等待时间,敌人恢复后马上又能出招。
第二,名额必须在打断、死亡、离场等路径上释放,而且只释放一次。否则群战管理器可能一直认为有人正在攻击,其他敌人就再也拿不到名额。正式实现还需要处理攻击启动失败时的回收。
6️⃣ 怎么判断调参是否有效
搭一个固定场景,先使用同一名敌人、同一套动作和同样的伤害。分别记录玩家受击、敌人开始进攻、攻击结束和玩家反击的时间。每次只调整一类参数,再比较几轮结果。
不要只盯着通关率。玩家虽然能赢,却可能大部分时间都在等敌人动;也可能连续受击后根本没有重新控制局面的机会。可以一起看以下问题:
- 敌人两次进攻之间,玩家实际有多少可操作时间?
- 玩家受击后,下一次威胁是否来得过早?
- 群战时,命中玩家的攻击有多少来自看不到的方向?
- 玩家能否说清楚自己为什么挨打,以及下一次准备怎样应对?
这些是测试观察项,不是本文已经得到的测试结果。示例流程还应检查首次进入战斗没有历史观察、攻击中断后归还名额、敌人离场释放资源,以及不同更新频率下等待时间是否一致。
对于新手与熟练玩家,要分别收集反馈。同一套等待时间,对新手可能刚够辨认动作,对熟练玩家却可能显得拖沓。
7️⃣ 给玩家留下可以理解的应对机会
从这个原型出发,下一步可以加入不同攻击距离、带提示的变招,以及队友之间的进攻协调。每增加一种行为,都要观察玩家是否还能理解它。
“更聪明”并不等于在每个瞬间都选择数学上最优的动作。一个敌人可以作出有效的应对,也需要通过动作和节奏让玩家看懂局势。难度设计值得反复调整的,正是这段从看见威胁到作出选择的时间。
📖 参考资料
AUTOMATON,《影之刃零》制作人采访 BOSS数量远不止30个 打不过别急着练技术(2026-10-09) https://automaton-china.com/all/article/interview/20261009-30770-ying-zhi-ren-ling-zhi-zuo-ren-cai-fang/
PlayStation,《影之刃零》官方游戏页面(配图来源) https://www.playstation.com/zh-hant-hk/games/phantom-blade-zero/