跳转到主要内容

六大类

令人意外的是,虚拟世界的命令只有六个类别,其中只有一半是情境之内的。把这些实现出来,你就具备了搭建一个基本虚拟世界所需的材料。这六大类是:

  • 退出虚拟世界(“quit”)。

  • 获取游戏说明(“help”)。

  • 记一条备忘(“bug”)1。

  • 通信(“tell”“say”“shout”“pose”,等等)。

  • 创建/销毁物体(“chop wood”)。

  • 状态变化(移动、“get”“drop”,以及其他所有命令)。

在这六大类里,从虚拟世界物理的角度看,最后一类最重要。

虚拟世界里的有形物体都有属性,属性又各有取值。属性可以有多种形式:“Mass”(质量)可能是一个整数;“label”(标签)可能是一个字符串;“location”(位置)可能是一组坐标;“contents”(内容物)可能是一个物体列表;“components”(组件)可能是一种树状数据结构。这些取值中,有些可以独立存在;另一些则可能因为取决于许多因素(例如对魔法的抗性),而要在每次使用时重新计算。

状态变化类命令会改动属性。比如说,一个简单的 “get”(拿),意味着把一个物体的位置从地板上改到角色身上;移动意味着把角色的位置属性从一个点改到另一个点;“open door”(开门)意味着把门的“opened”(已打开)属性改成 true。

当然,在实践中这要更复杂。有各种各样的前提条件需要满足(物体可能太重搬不起来,可能被固定住了,可能着了火,可能正被踩在脚下,还有一大堆别的烦人情况);需要生成反馈(你看见门开了,门另一侧的人也一样);属性本身也可以有不同的表示形式(位置可以表示为坐标,也可以表示为「包含/被包含」的层级)。不过,从设计者的角度看,实际的机制并不特别重要;更值得关心的是拿它们能做出什么。这是因为,除了物体的创建/销毁之外,一切有形的东西都可以用它们来做。

这意味着,你选择的属性决定了玩家命令的粒度,而命令的粒度又决定了物理的粒度。如果属性是细粒度的(比如说,如果你记录了一丛灌木上开着多少朵玫瑰,属性就可能是细粒度的),那么改动这些属性的命令也必须是细粒度的——因此,命令底下的物理还必须再细一点(因为正是它赋予了属性以意义)。人们是频繁使用这些命令还是很少使用,并没有什么区别;一旦你有了那样的细节层次,就必须支撑它。

同样,反其道而行,采用粗粒度的属性,你就会得到粗粒度的命令。如果花是花园的属性,而不是自身独立成物的物体,角色能拿它们做的事情就少得多(这意味着你的物理要处理的事情更少)。

至于该采用哪一档细节层次,这既取决于虚拟世界,也取决于真实世界。说取决于虚拟世界,是因为有些情境需要更细粒度的属性,而另一些情境没有它们也行。举例来说,一款谋杀悬疑侦探游戏需要为每个物体设定许多细致的属性,因为一丝不苟正是侦破的特征;而一款太空歌剧游戏则可以含糊带过大部分这类属性,因为它关心的是更宏大的尺度。不过,在所有情况下,真实的物理都是绝对的。玩家会有某些预期,并且会照着这些预期去行动。如果你鼓励他们往深处看,他们可能看得比你能应付的还要深;如果你只鼓励他们看表面,那又可能太表面,满足不了他们天生的好奇心。

在这里,设计者真正能做的,就是把自己放到玩家的位置上。先想象这个虚拟世界完成之后会是什么样子,再考虑玩家会想在里面做什么。按这一层次创建物体,按这一层次为物体设定属性,按这一层次规定命令。由此,你就能得出你的物理层次。

稍后我会更详细地讨论物体的属性 2。不过眼下,我们先接着看底下这套基本的物理系统,并问一个问题:如果你想模拟某种在真实世界里不可能的东西,会发生什么?


  1. 如果你愿意,可以把它(记备忘这一条)归到通信那一类,但我认为它比通信更基本。 ↩︎

  2. 为了不让你空欢喜一场,我先把话说在前头:我不会给出一份常见物体属性的清单。这一节的目的,毕竟是让设计者自己从基本原理出发去思考虚拟世界的物理。 ↩︎