20220520 - GAMES104 - Lecture 3:How to Build a Game World


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 而转动

按功能系统进行 tick

流水线 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

      确实

  • 物理和动画互相影响的时候怎么处理
    • 比如人受击,需要播放受击动画
    • 解决可能通过插值,先动画优先 后物理优先


Author:
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source !
  TOC