前言
用过QFramework框架的同学都知道其系统层不同于通常视频里挂载在游戏对象的Manger,没有不继承MonoBehavior,仅用于存储一定状态和共享上层逻辑。
那么要使用Unity的update系列API就需要创建游戏对象(GameObject)挂在脚本,然后通过事件把需要执行的代码注册进去,实现的方法很多,今天我分享的是其中一种我认为比较好的方法——门面(外观)模式。
1 设计图
下图省略了ISystem接口的内容。
2 个人理解
有句段子“没有什么问题是加一层不能解决的。”,而门面模式就是添加了一层层级,隔离了复杂系统与客户端,这一层接口是稳定的。
我在QFramework框架里,创建了GameManagerSystem类作为用户与系统的接口,每次进入某个场景,只需调用该接口即可启动相应的系统。
当然随着项目的不断深入,场景也会不断增加,因此我这里实现的有限状态机应该改为策略模式或抽象工厂去实现。
GameManagerSystem,在切换状态后,会把创建的系统类存入一个列表,然后GameManagerSystem本身拥有一个游戏对象,该对象的所有update系列(按需编写)会遍历列表,执行IGameSystem接口对应的方法。
例如FixedUpdate:
private void FixedUpdate()
{
for (int i = 0; i < SystemList.Count; i++)
{
SystemList[i].FixedUpdate();
}
}
3 总结
不知道大家实际使用的时候,会不会看见ISystem就无脑注册到IOC容器里,拿着锤子看什么都是钉子,我一开始也是这样的,到后来才醒悟,其实是可以按需创建,需要的时候用。
参考代码:TowerDefense2D