Games104-03如何构建游戏世界
怎样去构建一个游戏世界?
一个游戏世界由以下部件组成
- 动态游戏物体 Dynamic Game Object
- 静态游戏物体 Static Game Object
- 环境 Environments
- Sky
- Vegetation
- Terrain
…
- 其他物体
- 空气墙
- Ruler
- Trigger Area
- Navigation Mesh
…
在游戏世界中,以上这些物体都是通过类来进行管理,如果类的数量过于庞大,则会导致效率下降,所以,在现代游戏引擎中推出了组件的概念,通过组件来形成一个个不同的系统来提高效率。
怎样构建一个动态的世界?
通过不断的tick()函数,在一定的时间内不停地对游戏物体进行更新,从而达到动态的效果(如Unity)。
但是在现代游戏引擎中,tick不是按照GameObject进行的tick的,而是会把一个个系统先进行tick,这样的操作更高效。
怎么样实现世界中各物体的交互?
利用事件(Events)机制来将各个GameObject联系起来。
怎样去管理世界中的GameObject?
Scene Management
- GameObject在scene中被管理
- GameObject query
- By unique gameobject id
- By object position
- Simple space segmentation
- 不对场景进行分割(不适用于大型游戏)
- 将场景分割为网格
- 按对象簇进行空间划分(Segmented space by object clusters)
- 分层分割(Hierachical segmentation)
- 空间数据结构(Spatial Data Structures)
- 层次包围盒(Bounding Volume Hierarchies——BVH)
- 二叉空间分区树(Binary Space Partioning Tree,BSP Tree)
- 八叉树(Octree)
- 场景图(Scene Graph)
游戏世界中更复杂的情况
在GameObject进行交互的时候,可能会产生事件的冲突,例如当A物体向B物体发送消息的时候,B物体还未接收到消息就向A物体发送消息,这种情况下会产生十分严重的问题,针对该情况,往往会通过建立一个“邮局”,将各个物体需要发送的消息先统一放入“邮局当中”,然后通过邮局对消息进行逐一地派发,这样子就能避免事件之间的冲突。
总结
- 游戏世界中,所有事物都可以归为对象来处理。
- 每个GameObject 可以由不同的功能组件组成。
- 游戏对象的状态不断在tick函数中进行更新。
- 游戏对象之间的交互依赖于Event Mechanism事件机制。
- 游戏对象以高效的策略在场景中进行管理。
- 组件模式的缺点:在某种十分简易的情景下,使用组件会复杂化流程,效率降低。