中EN
概念页

游戏世界与游戏对象

Game World & Game Objects

游戏由玩法 (gameplay) 而不是技术定义;游戏机制 (game mechanics) 是支配游戏中各实体交互的规则,以及目标、成败标准、玩家能力、非玩家实体和整体流程(GEA 引用的论文称实现玩法的软件系统为游戏的 G 因子)。大多数游戏世界由静态元素和动态元素组成,划分为若干世界块,并由高层游戏流程组织玩家目标;动态元素通常实现为游戏对象 (GO),引擎提供的建模设施称为游戏对象模型,且分为工具侧和运行时两套(GEA4 卷 II 16、16.1–16.2)。

静态元素与动态元素

(卷 II 16.1.1)

类别例子
静态元素地形、建筑、道路、桥梁,几乎所有不移动、不主动参与玩法的东西
动态元素角色、载具、武器、漂浮的道具和血包、收集品、粒子发射器、动态光源、检测事件的不可见区域、定义路径的样条
  • 玩法集中在动态元素上。静态布局当然影响玩法(空旷方形房间里的掩体射击不好玩),但玩法软件主要负责更新动态元素的位置、朝向和内部状态。全部动态元素的当前状态合称游戏状态 (game state)。
  • 动态元素比静态元素更耗 CPU,所以多数 3D 游戏是"大片静态背景 + 少量动态元素";动态比例越高世界越"活",硬件进步让这个比例不断升高。《小行星》《几何战争》几乎没有静态元素。
  • 区分主要是优化手段:知道对象状态不会变,就可以少做工作,例如为静态网格预计算顶点光照、光照贴图、阴影贴图、静态 AO 或 PRT 球谐系数(见 预计算光照与光照贴图)。界线常常模糊:Hydro Thunder 的瀑布有动画纹理和水雾,但不与船交互,工程上按静态处理;可破坏环境可以为每个静态元素准备完好、受损、全毁三个版本,爆炸时动态替换。有的引擎干脆不区分。GEA 的结论是静态与动态只是一系列优化选择的两端,界线随优化方法和设计需求移动。
  • 静态几何:通常在 Maya 等工具里制作,可以是一个大网格或多块。常用实例化 (instancing) 节省内存:少量独特网格在不同位置、朝向多次渲染,例如五种短墙段随机拼成几英里的墙。也可以用源自 Quake 的笔刷几何 (brush geometry):用一组平面围成的凸体描述形状,制作快、易与 BSP 渲染引擎集成,适合快速白盒 (block out) 关卡,尽早低成本地测试玩法;布局可行再由美术贴图细化或替换成精细网格,需要重做也不会浪费美术工作(卷 II 16.1.1.1)。

世界块

很大的世界通常分成离散的可玩区域,GEA 称为世界块 (world chunk),也叫关卡、地图、舞台、区域。玩家同一时刻通常只看到少数几块(卷 II 16.1.2)。

  • "关卡"最初是为了在早期硬件的内存限制下提供更多变化:内存里一次只放一个关卡。
  • 现代拓扑:仍然线性但块间界线不明显;星形(中心枢纽连到各区域,可能需要解锁);图形(区域任意连接);营造"巨大开放世界"假象,用 LOD 降低内存和提升性能(见 细节层次)。
  • 除了最小的游戏,世界仍然要分块,原因有三:内存限制、控制游戏流程、分工(每块由一小组策划和美术负责)。UE5 用网格单元格自动流送的做法见 世界分区。

高层游戏流程

高层流程定义玩家目标的序列、树或图;目标也叫任务、阶段、关卡或波次。它还定义每个目标的成功条件(清光敌人拿到钥匙)和失败惩罚(回到区域起点、可能丢一条命)。剧情游戏的流程里还有过场,叫 cut-scene、游戏内过场 (IGC) 或非交互序列 (NIS);离线渲染后全屏播放的叫全动态视频 (FMV)(卷 II 16.1.3)。

早期游戏的目标和世界块一一对应(所以"关卡"有双重含义),如《大金刚》每关都是爬到顶。现代设计里每个目标关联一个或多个世界块,但有意保持松耦合,以便独立修改目标和世界划分。很多游戏再把目标归入更粗的章节/幕。下图示意 GEA 图 16.3 的结构:章节包含目标(含可选目标),目标映射到一个或多个世界块。

flowchart LR
  subgraph "第1章"
    O1A["目标 1A"] --> O1B["目标 1B"] --> O1C["目标 1C"]
    O1B --> O1D["可选目标 1D"]
  end
  subgraph "第2章"
    O2A["目标 2A"] --> O2B["目标 2B"]
  end
  O1C --> O2A
  O1A -.-> C1["世界块 1"]
  O1B -.-> C2["世界块 2"]
  O1C -.-> C2
  O1C -.-> C3["世界块 3"]
  O2A -.-> C4["世界块 4"]

游戏对象

动态元素通常用面向对象的方式设计:这与策划对世界的直观认识一致,策划自然希望在世界编辑器里创建和操作它们,程序员也自然地把它们实现为运行时大体自治的代理。GEA 用游戏对象 (game object, GO) 泛指几乎任何动态元素,业界也叫实体 (entity)、Actor、代理 (agent) 等(卷 II 16.2)。

  • 游戏对象 = 属性(当前状态)+ 行为(状态如何随时间和事件变化)。
  • 按类型分类:同类型的所有实例共享属性结构和行为,但属性值各不相同;如果行为是数据驱动的(脚本或数据定义的规则),行为也可以逐实例不同。
  • 类型与实例的区别至关重要:吃豆人有幽灵、豆子、能量豆、吃豆人四种类型,但任一时刻最多 4 个幽灵实例、50–100 个豆子、4 个能量豆、1 个吃豆人(GEA 的数字)。

    原书问题:街机版《吃豆人》每个迷宫开局有 240 个小豆和 4 个能量豆,共 244 个(Jamey Pittman《The Pac-Man Dossier》第 2 章,Game Developer 转载)。所以豆子实例最多是 240 个,"50–100"偏低。用数据定义"类型"本身的做法见 类型对象。

  • 大多数系统支持属性和/或行为的继承,以复用代码和设计。

游戏对象模型

"对象模型"在计算机科学中有两层含义:某种语言或设计语言提供的特性(如 C++ 对象模型),或为解决特定问题设计的一套面向对象接口(如 Excel 对象模型)。GEA 的游戏对象模型指引擎为建模和模拟虚拟世界中的动态实体提供的设施,兼具两层含义(卷 II 16.2.1):

  • 它是模拟某个游戏特定实体集合的一套具体面向对象接口;
  • 它常常扩展引擎所用的语言:用 C 写的引擎可以自行加上面向对象设施;即使用 C++,也常加上反射、持久化、网络复制等高级特性;还可能融合多种语言,例如 C/C++ 加 Python、Lua 或 Pawn 脚本,提供两边都能访问的统一对象模型。UE5 用宏和代码生成给 C++ 加上反射、序列化、复制和垃圾回收,就是这种扩展,见 UObject 与反射系统。

工具侧与运行时

世界编辑器展示给策划的对象模型,不必和运行时实现游戏的对象模型相同(卷 II 16.2.2):

  • 工具侧模型在运行时可能用根本没有面向对象特性的语言(如 C)实现;
  • 工具侧的一个 GO 类型在运行时可能是一组类,而不是一个类;
  • 工具侧的每个 GO 在运行时可能只是一个唯一 id,状态全部存在表或松耦合的对象集合里。

因此游戏实际上有两个密切相关的对象模型:工具侧对象模型由策划在世界编辑器里看到的 GO 类型集合定义;运行时对象模型由程序员用来实现它的语言构造和软件系统定义,可能与工具侧完全相同、直接对应,也可能底层完全不同。有的引擎两者界线模糊甚至共享实现,有的界线分明、运行时看起来"像外星人"。实现细节几乎总会渗透到工具侧,策划要了解自己搭建的世界和设计的规则对性能和内存的影响。下图示意同一个工具侧类型在运行时的三种可能实现。

flowchart LR
  T["工具侧 GO 类型 例如 宝箱"] --> R1["运行时一个类"]
  T --> R2["运行时一组协作的类 或组件"]
  T --> R3["运行时只是一个 id 状态存在各系统的表里"]

运行时对象模型的具体架构(以对象为中心、以属性为中心、组件化等)由 GEA 第 17 章展开。UE5 中工具侧的 Actor/组件与运行时基本是同一套类,见 Gameplay 框架;MassEntity 数据导向框架 则更接近"只是 id + 表"的那一端(这是对比归纳)。

GEA 第 17 章的补充:运行时如何实现上述概念(卷 II 17.1–17.10)

第 17 章把本页的工具侧概念落到运行时,统称玩法基础系统,分页记录如下:

高层游戏流程的实现(卷 II 17.10):对象模型只定义世界里有哪些对象、各自如何行为,并不涉及玩家的目标、完成后发生什么、失败了怎样。这需要一个控制高层游戏流程的系统,常实现为有限状态机:每个状态通常代表一个玩家目标或遭遇,并与虚拟世界中的某个地点关联;玩家完成任务后状态机前进到下一状态,给出新目标;状态机也定义失败时怎么办,常见的是送回当前状态的开头重试,失败足够多次、"命"用完后回到主菜单。从菜单到第一"关"再到最后一关,整个游戏的流程都可以由这个高层状态机控制。

Naughty Dog 在《杰克与达克斯特》、神秘海域和最后生还者系列中使用的任务系统就是这类基于状态机的系统:支持线性的状态序列(Naughty Dog 称之为任务 (task)),也支持并行任务:一个任务分出两个以上并行任务,最终再汇合回主任务序列。GEA 指出,正是并行任务让 Naughty Dog 的任务图有别于普通状态机,因为状态机通常一次只能处于一个状态。

flowchart LR
  T1["任务 1"] --> T2["任务 2"]
  T2 --> P1["并行任务 A"]
  T2 --> P2["并行任务 B"]
  P1 --> T3["任务 3:汇合"]
  P2 --> T3

上图示意任务图的形态:主序列在任务 2 后分叉,两个并行任务都完成后汇合到任务 3(示意图,非书中原图)。状态机的通用实现见 状态模式与有限状态机。

  1. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  2. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 16 章 16.1–16.2 节
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 17 章 17.1 节
  4. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 17 章 17.10 节

相关页面

游戏开发数据驱动与游戏世界编辑器Data-Driven Engines & Game World Editors当游戏行为可以部分或全部由美术和策划提供的数据控制,而不只由程序员写的代码控制时,引擎就是数据驱动的。它能提高团队效率、缩短迭代时间,但工具、健壮的运行时和预览手段都要花大量成本,过度设计反而降低生产力,所以要权衡并坚持 KISS。玩法领域里对应 DCC 工具的是游戏世界编辑器:创建世界块并放入静态和动态元素、设定对象初始状态和行为。GEA 列出了它的典型功能,并比较了不同引擎在何时做平台相关优化上的取舍(GEA4 卷 II 16.3–16.4)。游戏开发运行时引擎分层架构Runtime Engine ArchitectureGregory 把游戏视为“软实时、交互式、基于代理的计算机模拟”,把游戏引擎定义为数据驱动、可复用来做多款游戏的软件。运行时引擎按层组织:从目标硬件、驱动、操作系统、第三方 SDK、平台无关层、核心系统、资源管理器,到渲染、物理、动画、音频、网络等子系统,再到游戏性基础层和游戏专属子系统;上层依赖下层,避免循环依赖。游戏开发 · UE5世界分区World Partition世界分区 (World Partition) 是 UE5 的自动数据管理与基于距离的关卡流送 (Level Streaming) 系统:整个世界存为一个持久关卡,按可配置的运行时网格划分为单元格 (Cell),由流送源 (Streaming Source,默认是玩家控制器) 按距离加载/卸载。它配合一 Actor 一文件 (One File Per Actor, OFPA) 支持多人协作编辑,用数据层 (Data Layers) 按玩法状态切换内容,用分层细节层次 (Hierarchical Level of Detail, HLOD) 在远处以代理网格显示未加载的单元格。游戏开发 · UE5Gameplay 框架Gameplay FrameworkGameplay 框架 (Gameplay Framework) 是 UE 提供的一组相互配合的类,用来搭建游戏的基本结构:Actor 与组件 (Component) 构成场景中的一切;GameMode 在服务器上定规则并生成玩家;玩家由“控制器 (Controller) + 棋子 (Pawn)”组成;GameState 与 PlayerState 负责把全局与每个玩家的状态复制给所有客户端;GameInstance 跨关卡存活。游戏开发 · UE5UObject 与反射系统UObject & Reflection System虚幻引擎 (Unreal Engine) 的对象基类是 UObject。在 C++ 类、属性、函数上加 UCLASS/UPROPERTY/UFUNCTION 等宏,再由构建前的预处理工具虚幻头文件工具 (Unreal Header Tool, UHT) 扫描头文件生成代码,引擎就能在运行时“看见”这些类型——这就是反射系统 (Reflection System)。垃圾回收、序列化、编辑器面板、蓝图、网络复制都建立在它之上。游戏开发类型对象Type Object类型对象 (Type Object) 用“一个类的不同实例”来表示不同的逻辑类型:例如不为每种怪物写一个子类,而是一个 Monster 类加一个 Breed(种族)类,每个 Breed 实例描述一种怪物,怪物只持有指向自己 Breed 的引用。这样新增或修改种类只需要改数据,不必重新编译;代价是要自己管理这些类型对象,而且给每种类型定义不同的“行为”会变难。图形学预计算光照与光照贴图Precomputed Lighting & Light Maps烘焙 (baking) 是把辐射度或路径追踪等离线 GI 结果预先算好存起来,运行时直接查询。静态几何参与预计算并完整交互,动态物体只作接收者。数据可以是辐照度,也可以带方向(SH、H 基、AHD、球面高斯、环境立方体等),存储在光照贴图、顶点或体积/探针中,各有接缝、漏光、内存等取舍(RTR4 11.5.1、11.5.2、11.5.4 节)。图形学细节层次Level of Detail细节层次 (LOD) 在物体对图像贡献变小时改用更简单的表示。LOD 系统由三部分组成:生成(简化或手工制作多个版本)、选择(按距离、投影面积等收益函数挑选)、切换(尽量减少跳变 popping)。LOD 主要减少顶点处理,也通过减少 quad 过度着色降低像素开销;进一步还可在预算约束下全局选择 LOD,实现时间关键(恒定帧率)渲染。图形学空间数据结构Spatial Data Structures空间数据结构把几何体按 n 维空间组织起来,通常是层次化的树,使"几何体是否重叠"一类查询从 O(n) 降到大约 O(\log n)。常见类型有包围体层次 (BVH)、BSP 树(轴对齐的 k-d 树与多边形对齐两种)、四叉树/八叉树(含松散八叉树),以及更偏向组织模型关系的场景图。它们是剔除、光线求交、碰撞检测等加速算法的基础。游戏开发 · UE5MassEntity 数据导向框架MassEntity FrameworkMassEntity 是 UE5 面向玩法的数据导向 (Data-Oriented) 计算框架,属于实体-组件-系统 (Entity Component System, ECS) 一类设计:实体 (Entity) 只是一个 ID 加上一组片段 (Fragment) 数据,相同组成的实体归入同一原型 (Archetype) 并按内存块 (Chunk) 连续存放,无状态的处理器 (Processor) 通过实体查询 (EntityQuery) 批量处理片段。它适合成千上万个同质对象(人群、交通),MassGameplay 插件在其上提供表现、生成、LOD、复制、StateTree 等功能。游戏开发游戏世界的加载与流送Loading & Streaming Game Worlds世界加载系统负责两件事:把世界块和所需资源从磁盘读进内存的文件 I/O,以及这些资源的内存分配与释放;另外还要管理游戏对象的生成与销毁。GEA 按演进顺序介绍:一次只载一个关卡的栈式加载(LSR 资源压栈底),用小块气闸 (air lock) 区域实现基本无缝的过渡,再到把所有资产切成等大块、用块池分配器按关卡加载区域流送的细粒度方案(Naughty Dog);对象生成的内存问题有"不许运行时分配"、按尺寸分池、小内存分配器和内存重定位四种对策;存档则分检查点和随处存档(GEA4 卷 II 17.4)。游戏开发游戏对象引用与查询Game Object References & Queries游戏对象需要唯一 id 来区分、查找和充当通信目标;找到对象后还要能引用它,引用的寿命可以从一次函数调用到许多分钟。GEA 比较三种实现:裸指针最快最简单,但有孤儿对象、悬垂指针、非法指针三类问题,且不能配合内存重定位;智能指针可以检测对象已删除、做引用计数,但很难写对,GEA 个人建议远离它,非用不可就用 C++11 标准库或 Boost 的成熟实现;句柄是全局句柄表的整数索引,加上唯一 id 防止槽位复用后指向错误对象,简单而安全。对象查询则不追求通用数据库,而是为最常用的查询建专门的数据结构(GEA4 卷 II 17.5)。游戏开发游戏脚本系统Game Scripting脚本语言是主要用来让用户控制和定制软件行为的编程语言;在游戏引擎中,它是高层、相对易用、能方便访问引擎大多数常用功能的语言,程序员和非程序员都能用它开发新游戏或给现有游戏做 mod。GEA 先区分数据定义语言和运行时脚本语言,梳理语言分类与游戏脚本的典型特征(解释执行、轻量、快速迭代、方便),介绍 QuakeC、UnrealScript、Lua、Python、Pawn,列出从"脚本回调"到"脚本驱动整个游戏"的六种架构,再以 Naughty Dog 的 DCScript 为例讲虚拟机与原生函数接口,最后是对象引用、事件收发、面向对象脚本、脚本状态机和协作式多线程脚本(GEA4 卷 II 17.游戏开发游戏对象的实时更新Updating Game Objects in Real Time游戏对象更新就是根据上一时刻状态 Si(t − Δt) 求出当前状态 Si(t)。"每帧对每个对象调一次虚函数 Update(),并在里面顺带更新它的动画、物理、渲染组件"的简单做法在商业引擎里行不通:底层子系统需要批量更新才能高效,而对象之间、子系统之间又有依赖顺序。GEA 介绍的对策依次是:子系统由游戏循环直接批量更新、对象只操纵子系统中的"代理状态";在帧内多个阶段挂回调;按依赖森林把对象分桶,逐桶运行完整的分阶段更新(Naughty Dog 的做法);并用状态缓存和时间戳对付更新过程中的状态不一致和一帧延迟(GEA4 卷 II 17.6)。游戏开发游戏对象并发更新Concurrent Game Object Updates游戏对象模型要和几乎必然是多线程的底层子系统打交道,所以对象代码必须异步思考:耗时操作用非阻塞请求尽早发起、尽晚取结果,必要时容忍一帧延迟。作业之间的依赖决定了并行度 (DOP),每个依赖都引入同步点,"优化并发设计的秘诀是延迟"。对象模型本身也能并行:Naughty Dog 在把引擎从 PS3 移植到 PS4(《最后生还者 重制版》)时,让每个桶内的对象更新成为作业;桶间访问无需加锁,桶内读取用对象快照,桶内修改尽量避免,或加锁、或放进请求队列、或交给下一桶中的同步作业(GEA4 卷 II 17.7)。游戏开发状态模式与有限状态机State Pattern & Finite State Machines状态模式 (State Pattern) 把对象“依赖状态的行为”分散到各个状态类中,对象只持有指向当前状态的指针并把调用委托给它,状态切换就是换指针。它是实现有限状态机 (Finite State Machine, FSM) 的一种方式。FSM 能用很强的结构约束理清一团乱麻的标志位代码;状态组合爆炸、需要复用和需要“回到之前状态”时,分别用并发状态机、分层状态机和下推自动机来扩展。游戏开发世界块数据格式与生成器World Chunk Data Formats & Spawners世界块中的动态部分要为每个游戏对象记录两样东西:属性初始值和对象类型。GEA 比较了三种存储方式:二进制对象映像(生成最简单,但要处理指针、虚表和字节序,且对变化很脆弱)、序列化描述(XML/JSON/私有二进制格式,配合反射与类工厂),以及生成器 (spawner) + 类型模式 (type schema):生成器是只含类型 id 和键值对的轻量数据块,彻底切断世界编辑器与运行时代码的耦合;模式里的默认值配合"与默认值相同就省略键"可以让默认值的修改自动传播到旧实例(GEA4 卷 II 17.3)。游戏开发运行时对象模型架构Runtime Object Model Architectures玩法基础系统 (gameplay foundation system) 是位于"引擎与游戏分界线"附近、供构建游戏规则和动态元素的一组运行时组件,其中最复杂的是运行时对象模型:它在运行时实现世界编辑器展示给策划的抽象对象模型。GEA 把架构分为两大类:以对象为中心(每个工具侧对象对应一个或一小组类实例)和以属性为中心(对象只是一个 id,属性分散在按属性类型划分、以 id 为键的表里)。前者从单体类层次走向组合与组件,后者更省内存、更缓存友好、更易数据驱动,但难以表达属性间关系、也更难调试(GEA4 卷 II 17.1–17.2)。游戏开发事件与消息传递Events & Message Passing游戏天然是事件驱动的:爆炸、玩家被敌人发现、血包被捡起都是事件,系统要通知感兴趣的对象并让它们以各自的方式处理。用虚函数 OnExplosion() 通知属于静态类型的后期绑定,迫使基类为所有可能的事件声明虚函数;GEA 主张把事件封装成对象(类型 + 参数),实现动态类型的后期绑定,从而获得单一处理函数、持久性和盲转发。GEA 依次讨论事件类型(枚举 vs 字符串/字符串 id)、参数(派生类、Variant 数组、键值对)、处理器、职责链、兴趣注册、排队与否的利弊,最后是数据驱动的事件系统和以数据通路连接端口的图形化系统(如 UE 蓝图)(GEA4 卷 II 17.8)。综合引擎运行时架构总览Engine Runtime Architecture Overview本页把 wiki 中分散在 GEA 第 1、6、8、17 章及 GPP、UE5 相关页面里的内容串成一条线,回答"一个游戏引擎在运行时是怎样组织起来的":静态结构上是自下而上的分层,上层依赖下层;启动关闭按依赖顺序显式进行;每一帧由主循环驱动各子系统批量更新,游戏对象的逻辑被安排在子系统阶段之间,并按依赖分桶或设先后关系;多核上一帧被拆成成百上千个作业;玩法基础系统(对象模型、事件、脚本、世界加载流送、高层流程)位于引擎与游戏的分界线附近。各结论的细节与出处见所链接的概念页。游戏策划游戏的定义What Is a GameSchell 从玩具、乐趣、玩一路推到游戏,汇总三种经典定义得出游戏的 10 条性质,再从"人为什么喜欢游戏"反推:游戏是以玩的态度对待的问题解决活动 (a problem-solving activity, approached with a playful attitude);魔法圈 (magic circle) 其实就是大脑内部的问题求解系统。定义本身不重要,重要的是它带来的设计视角(第 3 版第 4 章;第 1 版为第 3 章)。游戏策划游戏机制Game Mechanics游戏机制是剥去美学、技术和故事之后剩下的交互与关系,是游戏的骨骼。Schell 承认没有公认分类(经济学"博弈论"只能处理过于简单的系统),给出一套实用的七类分法:空间 (Space)、时间 (Time)、对象/属性/状态 (Objects)、动作 (Actions)、规则 (Rules)、技能 (Skill)、机会 (Chance)。本页讲前六类;机会见 概率与期望值(第 3 版第 12 章;第 1 版为第 10 章,六类,没有"时间")。

被这些页面引用1 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原