第 8 章

会回应的世界

测试室里那匹马第三次以完全相同的姿态倒下时,有人关掉了显示器。不是愤怒地关掉。只是伸手按下电源键,屏幕暗下去,映出窗户和窗外圣迭戈三月平淡的天光。操作者是一位在Angel Studios时期就加入的引擎程序员,他没说话,椅子往后一推,站起来走向走廊另一头的咖啡机。这个动作本身比任何技术备忘录都更准确地标定了一个时刻:团队已经受够了。

不是受够加班,也不是受够进度压力。他们受够的是可预测性。一款关于西部荒野的游戏,每一匹马都以同样的方式死亡,每一具身体都以同样的角度倒地——这比技术限制更让人无法忍受的,是它正在否定西部本身。

西部不应该是可预测的。至少在他们想做的那个西部里,事故应该发生在坡度、沙石、马匹的体重和子弹入射角之间不可重复的交点上。

但此刻,2006年初的《荒野大镖客:左轮》发售两年后,Rockstar San Diego手里有的仍然只是一套传统动画系统。它调用预制好的动作片段,触发条件满足就播放,播放完毕就归位。

这种系统适合街机格斗,适合线性关卡,唯独不适合一片声称要模拟荒野的空间。荒野没有固定的碰撞角度,没有标准化的跌倒姿势。传统动画库把荒野变成了一个可穷举的目录,而目录翻完的那一刻,世界的说服力就耗尽了。

2006年春天,Rockstar San Diego内部启动了一个代号为“RDR2”的项目。需要明确的是,这是后来2010年《荒野大镖客:救赎》的开发代号,而非2018年那部以亚瑟·摩根为主角的续作。代号本身是行政流程的产物,但它代表了一个实质性决定:公司承认上一部作品的经验值得继续投资。西部题材可以从被日本发行商CAPCOM放弃的弃子,变成Rockstar自己的长线产品。

启动会议在圣迭戈米拉梅萨区的办公楼里召开,与会者包括当时的技术总监和几位从《左轮》时期留下来的核心工程师。没有留下详细会议记录,但与会者后来在不同场合回忆,那次会议确立了一个几乎相当于重新定义引擎能力的目标:让西部世界不只是背景,而是会对玩家行为做出回应的物理实体。

这个表述在当时语境下的分量,需要被精确理解。2006年的游戏产业不缺少开放世界。《侠盗猎车手:圣安地列斯》已经证明Rockstar可以在城市环境里铺开一张巨大的可交互地图。但城市开放世界的交互密度依赖于建筑、车辆、行人和交通信号构成的密集网格。每一栋建筑都是一个碰撞体,每一条街道都是一条约束路径,角色与世界的互动被城市本身的物理框架所承载。

西部荒野没有这些。它空旷、平坦、植被稀疏。一旦失去城市那种天然的物理结构,玩家不会觉得自己站在一片自由的大地上,而会察觉自己正站在一块巨大的布景板前方,布景板上画着远山和仙人掌,但布景板本身不会对任何行为产生回应。

这不是一个美学问题。它是一个物理问题。传统动画系统之所以在西部题材中失效,原因就在这里。

在城市里,角色与世界的互动大量发生在规则几何体之间——人行道是平的,墙壁是垂直的,楼梯有固定的台阶高度。预制动画在这种环境中可以奏效,因为碰撞条件相对有限且可预期。

但在荒野里,地面有坡度,岩石有斜面,马匹有四条可以独立运动的腿,人的身体可能在任何高度和角度下失去平衡。条件从有限变成了近乎无限。动画库永远无法穷举一个骑手从马上摔下时可能遇到的所有地形组合。强行用有限动画覆盖无限可能,结果就是玩家最终会看到重复。重复一次是技术限制,重复三次以上,世界就失去了作为“世界”的资格。

团队清楚,解决这个问题的路径不在地图设计,也不在动画数量。路径在物理模拟。

但物理模拟在2006年并不是一个新概念。大多数游戏引擎已经拥有基本的碰撞检测和刚体物理,可以让箱子被推倒、木桶滚下斜坡。

问题在于,这些系统处理的是物体,不是身体。一个木箱从坡顶滚落,系统只需要计算它的质心轨迹和旋转角速度。但一匹马中弹倒下,系统需要处理的是骨骼、关节、肌肉张力和神经系统反射——即使是被简化的模拟版本。这是两个完全不同量级的计算挑战。答案来自两个技术系统的深度整合。

第一个是RAGE引擎,Rockstar Advanced Game Engine,由Rockstar San Diego与Rockstar North联合开发。RAGE在2006年还处于早期迭代阶段,它的核心优势被定位在大规模开放世界的流式加载与光影渲染上。流式加载意味着玩家的移动不需要被频繁读盘打断,世界可以在后台分区装载、在视线边缘悄悄卸除;光影渲染则让沙漠、山坡、树林在同一套时间系统下呈现出连续的光照变化。

但RAGE负责的是世界的骨架。它决定了一块岩石在屏幕上出现的位置,决定了一束阳光穿过云层后的色温,却不知道一颗子弹打在马腿上之后那一瞬间应该发生什么。引擎是容器,不是容器里那些活着的身体。

第二个系统填补了这个空缺。它叫Euphoria,来自一家英国公司NaturalMotion。这家公司2001年从牛津大学动物学系衍生出来,创始人托尔斯滕·赖尔(Torsten Reil)的研究背景是神经生物学和计算机科学的交叉领域。

NaturalMotion最初的方向不是游戏,而是为电影和生物力学研究提供人体运动模拟。Euphoria引擎的核心原理与传统动画系统有根本区别:它不播放预设动画。取而代之的是,它为每一个人物或生物构建了一副简化的生物力学模型,包括骨骼、关节、肌肉群和神经系统模拟。当模型受到外力冲击——一颗子弹、一次碰撞、一次爆炸冲击波——系统会根据撞击点、力道方向、骨骼结构和重力关系,实时计算出身体下一帧的状态。膝盖向前软下去,躯干向某个方向倾斜,手臂因为失去平衡而扬起,最后整个人以某种不可完全复制的方式摔在地上。每一次倒地都是算出来的,不是从库里面选出来的。

这两套系统分属不同的知识谱系。RAGE来自游戏产业内部数十年的工程积累,它的设计目标是让大规模内容在有限硬件上高效运行。Euphoria来自学术研究,最初处理的问题是如何在计算机里重建脊椎动物的运动控制机制。

把两者深度整合,意味着Rockstar San Diego必须让一个为流式加载优化的引擎,与一个实时计算生物力学的系统在同一帧间隔内协同工作。游戏以每秒三十帧或六十帧运行,每一帧内必须完成对象加载、动画计算、碰撞检测和渲染输出。任何一帧的延迟都会导致动作断裂、画面撕裂,或者在更糟的情况下——让一匹马在半空中悬停半秒。

悬停不是修辞。早期整合测试中,这个故障反复出现。当Euphoria的计算结果无法在帧间隔内正确传递给RAGE的渲染管线时,被击中的角色会定格一瞬间,然后突然跳到下一帧的动作位置。工程师们给它起了一个内部叫法:“时停”。听起来像是一种超能力,但出现在西部题材里就是灾难。没有什么比一个悬停在半空中的枪手更能瞬间摧毁沉浸感。

修复时停问题耗费了数月。技术组最终通过在两个系统之间插入一个预测缓冲层解决了它,这个缓冲层可以提前推算下一帧可能的动作范围,即使Euphoria的计算出现微小延迟,渲染也不会中断。

这个方案对外部来说只是某次版本更新说明里的一行小字,但对Rockstar San Diego而言,它意味着整合终于走出了实验室。

整合只是第一步。要让这些技术从圣迭戈的测试室抵达Take-Two董事会的预算审批,还需要一次足够直观的演示。

这个机会出现在2007年的一次内部演示中。关于这次演示的具体日期已不可考,但它的场景被多位当事人反复提及:一道斜坡,一匹马,一发子弹。呈现方式简单到近乎苛刻。操作者将马匹放在坡面上,对着后腿开枪。

按照传统动画的做法,马会从固定库里选取一个后腿受击的倒地动作,然后身体沿坡面滑下一段。那条动画本身可能做得很好——马腿弯折的角度、倒地的速度、扬起的尘土,都是动画师手工调出来的。但问题不在动画质量,而在它的可重复性。第二次、第三次开枪,马都会以同样的方式倒下,偏差不超过几个像素。这种一致性在城市题材中可以蒙混过关,但在西部荒野里,它让死亡变成了一种仪式化的表演,而不是事件。

2007年演示的那天,Euphoria给出了不同的答案。子弹击中后腿的瞬间,撞击点附近的肌肉群在模型中被标记为受力状态,后腿先是一沉,膝关节向内弯曲,马蹄在坡面的碎石上打滑。前蹄因为突然失去后腿的支撑而向坡下滑去,马头向下压低,整个身体的重心偏移,躯干顺着坡度扭出一个不规则的弧线。最后侧倒在坡面上时,四蹄还各自作出了试图蹬地的动作——那是神经系统模拟仍在输出的残余信号,在物理上已经不可能重新站起来,但算法还没有把“已死亡”的状态完全锁死。于是那匹马在倒地的最后一瞬,仍在执行一次永远无法完成的站立尝试。

房间里安静了几秒。随后有人提问:这能在产品里稳定运行吗?这个问题翻译过来是:我们能不能在几百万台主机上保证这个效果不崩溃,能不能在预算范围内把它做到发售级别,能不能不让这个演示变成一个永远只能出现在封闭房间里的技术幻想?这些问题没有当场被回答。

技术总监给出的回应是有条件运行——限制同屏生物数量,对碰撞频率做适配,在特定硬件上关闭部分次级物理运算。所谓有条件,听上去总像是在留后路。但那匹马已经完成了它最重要的任务。它让一个抽象的技术方向变得可以被看见。而且不止被看见,还被感受到了——马在坡面上最后一次蹬地的动作,不是任何动画师设计的,是算法根据那一帧的关节角度和地面法线实时算出来的。它不属于任何一条动作库里的条目。它只发生一次。

演示之后,Take-Two没有立刻释放全部预算,但也没有终止项目。资金继续进来,团队从最初的几十人开始逐步增长。

具体数字没有公开,但外部招聘信息显示,Rockstar San Diego在2007年下半年到2008年初持续招聘物理程序员、动画程序员和AI设计师。职位描述中开始反复出现“程序化动画”和“物理驱动的角色运动”这样的措辞,这些在当时的游戏行业招聘中仍然相当罕见。

项目正在从技术验证阶段走向生产阶段,但仍悬在一个危险的平衡上:投入在增加,产出尚未可见,进度表不断被修订。这是每一个大规模技术整合项目都要穿越的隧道,而隧道里没有里程碑。

就在物理组埋头解决碰撞法线和帧同步问题的时候,另一群人开始构建一套完全不同的系统。它的名字后来被称为荣誉系统,但在2006年末到2007年初的原型阶段,它的内部叫法是“记忆层”。这个名字更准确地描述了它的功能:让世界记住玩家做过什么。物理层负责即时的动作回应——子弹击中哪里,身体怎么倒,碎片怎么飞。记忆层负责积累的后果回应——商店老板是否被抢劫过,路边的行人是否被帮助过,镇子上的居民是否看到过你在后巷虐待动物。物理层处理的是世界如何被你打碎,记忆层处理的是世界如何把你做过的事写进自己的运行规则里。

荣誉系统原型的最早版本粗糙到几乎无法辨认。开发者在一次内部测试中尝试了一种最简单的实现方式:给每个NPC附加一个数值标记,正面行为加值,负面行为减值。

数值越过某个阈值,NPC的态度发生变化——从友好变成警惕,从热情变成敌意。这种二进制式的设计在理论上成立,在实际运行中却出现了大量问题。一个测试玩家在小镇上杀死了一只狗,附近的居民按设定应该对他产生敌意。但系统没有定义“附近”的范围应该多大。有时候,站在二十米外的一个商贩会立刻开始咒骂玩家,而那个就在狗旁边目睹了一切的牧场工人却毫无反应。信息传递的逻辑断裂了。世界做出的回应与玩家期待的逻辑不一致,这种不一致比不回应更糟,因为它让世界显得不公正。而不公正的世界无法建立起任何道德叙事的说服力。

更棘手的问题出在跨任务记忆上。在主线任务中帮助过一个角色,任务结束后那个角色是否会记住这件事?如果记住,记忆应该保存多久?一次存档加载之后,世界是否还能保持之前积累的态度网络?这些问题在今天看来是开放世界设计的基础课题,但在2006年却没有现成的答案。

当时大多数游戏的NPC行为都是任务驱动的——任务触发时激活脚本,任务结束后脚本关闭,世界重置到等待下一个任务的状态。荣誉系统要求的是一种完全不同的运行模式:世界永远不重置。即使玩家离开一个区域数小时后再回来,那个区域里的人仍然应该记得他上次在这里做过什么。这意味着需要一套持久化的数据系统来跟踪玩家与世界的互动历史,而这在当时对主机内存和存档系统都构成压力。

压力之下,分歧出现了。一部分人主张暂时搁置荣誉系统,把精力集中到Euphoria的调优和枪战系统的打磨上。他们的理由很实际:玩家买游戏是为了开枪和骑马,不是来测试世界的道德判断是否公正。物理模拟已经占用了大量资源,再塞进一个半成品的社会模拟系统,只会让项目在进度和预算上双双失控。

况且荣誉系统在早期测试中几乎不被注意——玩家忙着赶路、接任务、开枪,很少有人会停下来观察商店老板的眼神是否比之前冷了一分。为一个没人注意的功能冒险不值得。另一部分人不同意。

他们的代表是当时负责系统设计的一位资深设计师,此人在Rockstar North参与过《侠盗猎车手》系列的NPC行为设计。他的论据不是来自西部片,而是来自城市。他说,当年《侠盗猎车手III》第一次让城市在玩家下车之后依然活着——行人继续走路,车继续开,雨继续下——那个效果不是靠任何一个单独的系统做到的,而是靠无数个细节系统共同维持的一种连续感。如果西部世界只能对子弹产生物理回应,却不能对道德行为产生记忆,那它就不是活的世界。它只是一个靶场。靶场不需要记忆,但西部需要。因为西部故事从来不只是关于谁拔枪更快,而是关于一个人在荒野里做过的事,最终会以什么样的方式回到他面前。

这场争论在2007年下半年达到顶点。在一次周会上,两边的意见正面碰撞。物理组的人带来了一组数据:当前版本中,Euphoria在同屏出现超过六个角色时帧率开始下降,优化空间已经非常有限。

系统设计组的人则播放了一段试玩录像:玩家在镇子里杀死了一条狗,站在狗旁边的NPC完全没有反应,而三十米外一个背对现场的妇人却在同一秒回头骂了一句脏话。两边的证据都指向同一个结论——技术资源不够用。必须在物理模拟的精度和记忆系统的覆盖面之间做出取舍。

主持会议的制作人没有当场裁决。他把问题拆成了两部分。第一部分的讨论范围限定在技术可行性:能否在不显著增加运算负载的前提下,用一套简化但可扩展的架构实现基本的记忆功能?第二部分涉及的则是设计哲学问题:如果西部开放世界只能保留一个区别于城市开放世界的特征,那个特征应该是什么?枪战的手感可以在后续迭代中打磨,地图的规模可以在后续项目中扩大,但世界是否具备记忆能力,一旦在这个项目中缺失,就可能被定义为“西部不需要道德回应”。这个定义一旦固化,以后就很难逆转。

第二部分的讨论持续了数次会议。最终推动决定的不是某个人的雄辩,而是一系列小规模测试的结果。

系统设计组做了一个简化版原型,去掉了复杂的数值渐变,只保留三个等级的态度标记:友好、中立、敌意。触发条件也做了大幅简化——只有三类行为会影响态度:暴力犯罪(抢劫、杀人)、救助行为(帮助受伤者、解救被绑架者)、虐待动物。测试中,玩家骑马进入小镇,如果之前曾在杂货铺抢劫,店主会在玩家靠近时提前关门,这个动作的脚本只需要检测一个全局变量。如果玩家救过一个路人,某些NPC在相遇时会点头致意,这个动作同样只依赖一次变量查询。简化之后,系统在测试环境中的额外运算负载降到了可接受范围内。

门的关闭和点头致意,本身是微小的动作,但它们传递的信息却足够清晰:世界在看你。

2007年末的一天,制作人在一次内部邮件中正式确认,荣誉系统的原型将继续保留在开发计划中,与物理模拟并列为主系统的组成部分。这封邮件的措辞谨慎,没有宣布任何“革命性”的突破,只是说项目将同时推进两个方向,并授权系统设计组扩充人员。但圣迭戈办公室里的人知道这意味着什么。

它不是预算层面的胜利——预算当时仍然紧张。它是原则层面的确认:这片西部荒野不会被建成一个只有物理没有记忆的靶场。把记忆机制写进开发计划,这件事本身可以看作一个信号的释放。它所释放的信息是,Rockstar San Diego正在形成一种新的设计原则。这条原则后来会在整个Rockstar的开放世界产品线上反复出现,但在2007年,它还只是圣迭戈那栋办公楼里一群人正在摸索的东西:世界不是等待玩家触发的静态布景,而是一个持续运转、会对玩家行为做出道德判断的生态系统。

这个表述在内部文件中没有出现,但可以从技术文档的编排中读出端倪。物理层和记忆层被放在同一个系统架构图的两侧,中间用一条双向数据流连接。物理学负责身体,记忆负责态度。两者共享同一套事件检测机制:玩家的一举一动都被事件系统捕获,然后根据事件类型分别送往物理引擎和态度管理器。前者输出碰撞、跌倒和碎片,后者输出NPC的行为偏移。这套架构在2008年初达到一个关键节点。

团队完成了一段连续的试玩演示:玩家骑马进入一个边境小镇,杂货铺的老板因为之前被抢过,远远看到玩家的马匹就转身关上店门;路边一个曾被玩家救过的矿工点头致意;玩家在镇外斜坡上对一匹马开枪,马的后腿中弹,顺着坡度滑倒,四蹄在碎石上打滑,动作完全由实时物理计算驱动,地形坡度决定了倒地方向和姿态。

这些片段放在今天看也许不算惊人,但在2008年的语境下,它第一次展示了物理回应和记忆回应同时在同一个开放世界里运转的可能性。门关上是因为世界记得你的恶行,马倒下是因为世界响应了你的子弹。两者来自不同的系统,但对玩家来说,它们都是世界对你的回答。

此刻可以回到那匹被反复击中的马。2006年测试室里那一幕,程序员关掉显示器,走出去倒咖啡——那个动作里藏着的不是失望,是一种判断。他判断传统动画已经触碰到了天花板。动画师可以画出一百种马的倒地姿态,但第一百零一种仍然会在某个特定的坡度、某种特定的沙石摩擦力下出现。

而第一百零一种与第一种之间的裂痕,不会因为增加更多预制动画而弥合,只会因为玩家看到重复而被放大。所以关掉显示器不是放弃,是在等一种更好的工具出现。两年后,那匹马重新站在坡面上。这一次中弹之后,它的身体不再执行任何一条预设动画。后腿的膝关节根据子弹入射角计算出弯折方向,马蹄在坡面碎石上的打滑距离由摩擦系数和坡度共同决定,前蹄在失去支撑后的挣扎时长取决于神经系统模拟的输出状态。它的倒地是独一无二的,不是因为艺术家的判断让它独一无二,而是因为物理规则让它无法被复制。世界在这一刻不再是布景,而是一个可被穿透、可对行为做出实时响应的物理实体。

但这件事的意义不止于物理。当荣誉系统的原型开始运行,当杂货铺的门在玩家接近时提前关上,世界回应的就不只是子弹的动能,还有行为的道德后果。物理回应让每一次开枪都有分量,记忆回应让每一次选择都有痕迹。两者合在一起,完成了西部开放世界从“看起来像西部”到“行为上像西部”的跨越。

在这个跨越完成之前,任何关于“人逃不出自己的过去”的叙事野心都只能靠过场动画来灌输。现在,它有了可以写入机制的载体。玩家的过去不再是一段需要编剧通过闪回交代的剧情背景,而是一串存储在世界里的变量,会在他每一次返回小镇时,通过一扇提前关闭的门和一句冷下去的问候被重新唤醒。

这就是2008年前后Rockstar San Diego在圣迭戈留下的状态。一个会回应的世界已经有了骨骼和一部分神经。它可以记住门是否关上,可以算出马蹄在碎石上的一滑,可以让一具受伤的身体在斜坡上倒得独一无二。

但它还缺一颗心脏——一个能与这种回应性相匹配的人,一个真正背负着过去行走在荒野上的灵魂。技术已经证明世界可以记住你,接下来要回答的问题更残酷:如果世界真的记住了你做过的一切,你还能逃得掉吗?