莎木 1&2

Shenmue I & II

荒野大镖客 救赎2

Red Dead Redemption 2

当你忙着拯救世界时,NPC都会干些什么?

作者 箱子   编辑 箱子   2019-02-02 11:48:58

这是一场感性与理性的交织。

尘归尘,土归土

  你应该已经发现,上文提到的 NPC 行为不是单一线性的。《荒野大镖客 救赎2》的马夫就“恰逢下雨”而躲到了农场中,有些角色撞到路过的马车也会大喊大叫。从更学术的角度来看,如果想要他们的人生不那么单一,程序端的“应激设计”就至关重要了。

  以黑岛工作室惯用的分支式对话和交互为例,当玩家与 NPC 交谈时,对话列表的每一个选项都会触发不同行为,这很有可能影响到游戏进程。包括《魔兽世界》在内的许多 MMO,会使用 Lua 脚本决定人物的对白反馈,它也可以延伸到更多应用上。

  假设将 NPC 的一种行为视为“一个状态”,我们可以加入事件,不断的用“如果/那么”的逻辑将所有情况串联起来,这是「状态机」的浅显概念,也是一种决定 NPC 行为的常用手法。

当敌人靠近时,切换为追击状态,作者地址

  不妨以《上古卷轴5》中卫兵的视角来写个状态机 —— 隔壁村的「老王」杀了只鸡,卫兵和他的关系变为敌对,接下来就会引发一系列事件:

  我“站岗”,如果“发现老王”,那么“追击老王”;
  我“追击老王”,如果“超过追击范围”,那么“回城站岗”;
  我“追击老王”,如果“追到老王”,那么“攻击老王”;
  我“攻击老王”,如果“老王死亡”,那么“回城站岗”;
  我“攻击老王”,如果“血量少于30%”,那么“逃跑求援”。

  Rockstar 设计的 NPC 行为就能用状态机来解释,马夫每天中所做的事是固定脚本,但突然出现了“下雨”事件,从而改变了状态,于是他就和农场工人攀谈起来。有时,我们还可以把上面框框中的所有状态“打包”,并构筑另一个条件来触发它,形成逻辑更为复杂的「分层状态机」。

  好比将「马」的大状态分为“高兴”和“愤怒”,它们之间可以依条件切换。而高兴中又分为“蹦塔”和“摇尾巴”,愤怒中包括“狂吠”和“踢人”,这些小状态也可以依条件切换。如果应用得当,NPC 的行为完全可以脱离玩家,变得更为鲜活。

  当然,决定他们人生的方法不只这一种,NPC 也可能受到「行为树」的掌控。他与状态机相同,也是当前设计 NPC 行为的主要方式。整体而言,行为树并没有脱离“如果/那么”的基本逻辑,你甚至可以把它当成《底特律:成为人类》的事件触发表。

  如上图,当 NPC「猫奴」的动作执行到“吸猫节点”时,一旦成功吸猫,那么这条树分支就宣告结束。但如果他没吸到猫,失败的结果就会返回到母节点,然后从第二个子节点开始继续推进行为。行为树的优点是逻辑直观,与之相对的是,如果 NPC 被设计得较为复杂,遍历合适节点的过程就会占据很多运算资源。

  这些深层次的原理,其实也引出了一个有些残酷的事实。电子游戏中的 NPC 毕竟由 0 和 1 构成,为了节省资源,当你远去拯救世界时,程序往往有一套“自我销毁的机制”。

  即使玩家的电脑好到一定程度,也不可能同时呈现整个天际省的花花草草。如果 NPC 处于视野范围之外,程序可能就不再渲染他们的建模,此时的 NPC 就如同《攻壳机动队》中的草薙素子,只剩下一堆运行的代码,没有实体可言。更为彻底的销毁方法是,随着地图的转换,用不上的代码也会从内存中清除。

  不过,NPC 的最初定义来源于桌面上的“非玩家角色”(Non-Player Character),这个笼统的划分范围,反而为其提供了极为广阔的拓展空间。他们时而化身为协助者,帮助玩家更好的成长,时而又站在我们面前,成了一块恼人的绊脚石,或是以受害者的形式,勾起你的恻隐之心。

  木讷而机械的形象,从来都不是 NPC 的唯一体现形式。那些虚拟形象的背后,或许长着一张与我们相同的有机脸孔。即使从解构主义的层面来看,看似冰冷的代码,也凝结了制作者的内心表达。NPC 所彰显的可能性充实了幻想,他们同样生根于人们心中,不断重演着属于自己的精彩故事。

| (37) 赞(121)
箱子 点赞狂魔

原来小丑就是我。

关注
点赞是美意,打赏是鼓励

评论(37

跟帖规范
您还未,不能参与发言哦~
按热度 按时间

总贡献榜