游戏世界组成
构建游戏世界有三个核心问题:
1、游戏世界包含哪些东西
2、我们应该如何描述这些东西
3、这些东西应该如何被组织起来
应该包含哪些东西
- 动态游戏物体(坦克飞机等)
- 静态游戏物体(房屋等)
- 环境元素(天空、地形、植被)
- 其他对象(空气墙、检测区域等)
应该如何描述这些东西
- 属性Property(形状、位置等)
- 行为Behavior(移动路线等)
应该如何被组织起来
属性和行为这两点容易联想到面向对象语言的类,其中属性为成员变量,行为为成员函数。
这种情况下新设定属性和行为也很容易被理解,包括进一步的派生和继承逻辑。
早期游戏引擎便使用这种方法。
但这种方法有弊端,比如水陆两栖坦克继承于多个基类(虽然我觉得就是多重继承的问题…)
所以后来常用的方法是:组件化。比如装不同的配件可以让挖掘机变推土机、不同枪械之间的转化等。更抽象来说,不同属性和行为都可以变成不同组件(继承自组件基类),将它们组装起来就是一个新的类。代码上即在物体类中包含了一个带有组件基类指针的容器。
怎样让游戏世界活起来
Tick
- 基于对象的Tick(每个对象为单位,符合直觉)
- 基于组件的Tick(流水线,游戏中所有的component一般都集中放在一起,将同一物体放在一起从而调用时提升效率)
如何交互
比如炮弹打出去轰在地上
HardCore (现在少用)
打在地上时检测周围范围内的对象,调用它们对应的函数
Events 事件
给周围对象发一封邮件,每个对象在下一个tick时检测,若检测到邮件(Event)则调用相关函数
怎样管理游戏对象
场景管理
游戏对象在场景中,一般按以下排成队列:
- GUID
- 位置
对象间交互时可以利用分块来降低复杂度,比如八叉树、BVH等
总结
- 一切都是对象
- 游戏对象可以用基于组件的方式来描述
- 游戏对象的状态会在tick循环中更新
- 游戏对象通过事件机制相互作用
- 游戏对象在场景中使用有效的策略进行管理
还有时序问题:
因为对象之间存在绑定关系和依赖关系,所以有时对象之间会同时发送event问题(因为并行执行),这样就导致悖论。另外还有循环依赖问题也类似。
解决方案:邮局。由邮局进行事件管理。