游戏都有啥?
可交互的动态游戏物体(Dynamic Game Object)
静态物体(Static Game Object)
环境,地形系统(Sky+Vegetation+Terrain)
其他物体(Air Wall+Trigger Area+Ruler+Navigation mesh)
核心:GameObject(GO)
里面的数据有两种
a.Property,对应字段
b.Behavior,对应方法
简单的办法,直接用普通的class,然后继承这个class
但是往往没有这么清晰的父子继承关系,有大部分重叠的逻辑
现代引擎:组件化(Component Base)
比如FPS游戏,枪里面的各个配件就是这个思想
class GameObjectBase
{List components;virtual void Tick();
}class ComponentBase
{virtual void Tick();
}//... 各种功能组件继承 ComponentBase
如何让游戏运行起来?
Tick 各个 Component
管线式 Tick ,各个系统整体 Tick,不是每个 GameObject 单独 Tick
优点:
1.无需等待,每个系统专心负责自己的职责,批处理
2.充分利用CPU(相同的数据尽可能放在一起)
如何让游戏物体可以交互?
各个 GO 需要彼此之间通信
1.硬编码(Hard code)
2.事件(Events),解耦合,自己只需发送,无需关心接受不了
难点:
物体之间的绑定
比如人开车,人需要跟车一起动
需要有不同 GO 的 Tick 顺序处理,父节点优先
同理 Events 也需要有顺序处理,绝对不能混乱!!如果用户输入一致,逻辑一定不能乱
需要通过第三方传递消息,第三方来控制组件的依赖关系
如何管理各个GO?
都有 unique ID,作为唯一标识
也都有 position
通过场景管理进行空间管理
a.暴力算法,只适合小游戏
b.网格法,简单,不适合分布不均匀的游戏
c.四叉树,管理空间
d.高级的办法,BVH、BSP、Octree、SceneGraph
需要根据不同的游戏类型,做不同的处理