Games104 Lecture 3 如何构建一个游戏世界

游戏世界组成

构建游戏世界有三个核心问题:
1、游戏世界包含哪些东西
2、我们应该如何描述这些东西
3、这些东西应该如何被组织起来

应该包含哪些东西

  1. 动态游戏物体(坦克飞机等)
  2. 静态游戏物体(房屋等)
  3. 环境元素(天空、地形、植被)
  4. 其他对象(空气墙、检测区域等)

应该如何描述这些东西

  1. 属性Property(形状、位置等)
  2. 行为Behavior(移动路线等)

应该如何被组织起来

属性和行为这两点容易联想到面向对象语言的类,其中属性为成员变量,行为为成员函数。
这种情况下新设定属性和行为也很容易被理解,包括进一步的派生和继承逻辑。
在这里插入图片描述
早期游戏引擎便使用这种方法。
但这种方法有弊端,比如水陆两栖坦克继承于多个基类(虽然我觉得就是多重继承的问题…)
所以后来常用的方法是:组件化。比如装不同的配件可以让挖掘机变推土机、不同枪械之间的转化等。更抽象来说,不同属性和行为都可以变成不同组件(继承自组件基类),将它们组装起来就是一个新的类。代码上即在物体类中包含了一个带有组件基类指针的容器。

在这里插入图片描述
在这里插入图片描述

怎样让游戏世界活起来

Tick

  1. 基于对象的Tick(每个对象为单位,符合直觉)
  2. 基于组件的Tick(流水线,游戏中所有的component一般都集中放在一起,将同一物体放在一起从而调用时提升效率)

在这里插入图片描述

如何交互

比如炮弹打出去轰在地上
HardCore (现在少用)
打在地上时检测周围范围内的对象,调用它们对应的函数
Events 事件
给周围对象发一封邮件,每个对象在下一个tick时检测,若检测到邮件(Event)则调用相关函数

怎样管理游戏对象

场景管理
游戏对象在场景中,一般按以下排成队列:

  1. GUID
  2. 位置

对象间交互时可以利用分块来降低复杂度,比如八叉树、BVH等

总结

  1. 一切都是对象
  2. 游戏对象可以用基于组件的方式来描述
  3. 游戏对象的状态会在tick循环中更新
  4. 游戏对象通过事件机制相互作用
  5. 游戏对象在场景中使用有效的策略进行管理

还有时序问题:
因为对象之间存在绑定关系和依赖关系,所以有时对象之间会同时发送event问题(因为并行执行),这样就导致悖论。另外还有循环依赖问题也类似。
解决方案:邮局。由邮局进行事件管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值