Lecture 3 How to Build a Game World
如何构建游戏世界
- 游戏世界由什么组成
- 如何描述这些事物
- 这些东西怎样被组织
What does a game world consist of?
Dynamic Game Objects
可交互物体
Static game object
各种不可交互物体
environments
环境
- 填空
- 植被
- 地形
Other game objects
碰撞体
玩法规则
Everything is a Game Object (GO)
How to describe a game object
- property
- shape
- position
- capacity of battery
- behavior
- move
game object
定义数据和行为
优点:清晰直观
缺陷:很多东西不好归类,比如水陆两栖坦克
解决办法:组件化 - component
回到无人机,将其拆解为组件:
- transform
- model
- motor
- ai
- animation physics
现代游戏引擎原则:尽可能符合直觉,既适用于程序,也适用于设计人员
UObject 和 Object 是对象,管理生命周期,不是上面所提到的 GO
GO 对应的应该是 Actor 和 GameObject
Takeaways
- 游戏世界中的所有东西都是 game object
- game object 可以以组件化方式进行描述
How to make the world alive?
Object-based Tick
可以视为 unity 的 update 函数
世界因 tick 而转动
How to Explode an Ammo in a game
世界内部的交互
Hardcode(旧,效率低,无法处理更大体量的游戏世界)
- 子弹射出
- 射出路线与世界中物体有交集
- 触发爆炸
- 寻找爆炸范围内的其他物体
- 产生交互
Events(放下邮件,让对方处理)
- 消息发送和处理
- 把事件发送和处理解耦化
要做可扩展的消息系统,以供用户自定义
How to manage game objects
Scene management
- GO 在场景中被管理
- 每个 GO 的标识
- 有唯一编号
- 可通过位置
消息发送方式
- 完全不划分区域
- 网格划分
- 场景不均匀
- 层级划分
- 基于物体簇划分
- 层级划分
- 有不同的划分方式
- 二叉树
- 八叉树
- bounding volume hierarchies (BVH)
takeaways
- 所有物体都是 object
- game object 可以被组件化描述
- GO 的状态在 tick 循环中更新
- GO 之间通过 event 机制交互
- GO 在场景中被一些高效策略来管理
- tick 顺序
- 父节点先 tick
- 并行执行的时序很重要
确实,不注重先后,协程调用会出现混乱,害
游戏录像:引擎将事件再次执行,原则上输入一定,输出一定相同,但多线程运行时顺序不一定,此时需要引入所谓邮局,会给所有“邮件”唯一时间戳
Lecture 03 Contributor
感谢前辈们的辛勤付出
Q & A
- tick 时,渲染线程和逻辑线程怎么同步
- 一般二者分开进行
- tick logic 一般比 tick render 早一些
- 空间划分怎么处理动态游戏对象
- 遍历肯定是最慢的
- 需要根据游戏类型和需要来选择特定的划分策略 按需更新
- 引擎需要支持两三种以上的空间划分方法
- 组件模式有什么缺点
- 在数量级较低时候其实组建模式相较于直接实现效率更低
- 但这也是引入 ECS 的目的,提高效率
- 组件间也有通信机制,期间的频繁 query 会降低效率
- 在数量级较低时候其实组建模式相较于直接实现效率更低
- event 怎么调试比较好
- 锁定 GO 把它发送的消息全部显示
- 最有效的 debug 就是 log
确实
- 物理和动画互相影响的时候怎么处理
- 比如人受击,需要播放受击动画
- 解决可能通过插值,先动画优先 后物理优先