第三节:如何构建游戏世界
如何让游戏世界活起来
Dynamic Game Object
Drone
Air-defense Missile
Solider
Artillery
Tank
Static Game Object
Boxes
Watchtower
Shack
Shed
Stone
Environment
Sky (tone of day 日夜变换系统)
Vegetation (植被)
Terrain
Other Game Objects
Air wall
Trigger Area
Ruler
Navigation mesh
Everything is a Game Object
How to Describe a GameObject
Name
Property
Shape
Position
Capacity of battery
Behavior
Move
Scout
OOP
通过面向对象的方式描述游戏物体,
但是实际上多派生会出现问题
实际上的现实中的物体不是清晰的树状派生关系,而是功能组合居多
Component Base
组件化,通过组件组合成游戏对象
Takeaways
Everything is a game object in the game world
Game object could be described in the component-based way
Make world alive
Object-based Tick 是直观的,但是是效率低的
高效的 Tick 的执行是遍历同类型的每个个体,而不是同个体的每个类型
按照流水线的做法比较高效,把同样的 component 放在一起进行批处理
Interactive
Hard code : 实时
Events :发送事件邮件,在下个 tick 触发
Interface
可拓展的消息系统
Manage Game Object
如何管理游戏物体
Game object uid
position
Scene management 空间管理的核心
No division
Divided by grid
Quadtree :角色在场景中分布是很不均匀的,所以不用均匀的格子
Hierarchical segmentation 树状结构划分
复杂情况
并行执行情况下的时序一致
GO Binding,父子节点情况,需要先更新父节点
程序执行需要做到确定性,即相同的输入可以得到相同的结果
多线程情况下执行还是确定性的
需要有同步点,GameObject 间不能直接发送消息
可能逻辑间有循环依赖,
可能在当前帧递归处理,也可能再下一帧再处理
根据处理方式可能会导致延时情况(lack)
Q&A
一个 Tick 运算时间过长,可以拆分单位分帧运算。即流式。
空气墙和其他 go 的区别
渲染线程和逻辑线程的同步
空间划分处理动态游戏对象 :
event 调试
物理和动画互相影响:受击时由动画过渡到物理
最后更新于