中央管理器GameManager

背景

  框架内各个模块或系统如果都交由场景中的物体去创建实例,会引起一系列问题,最大的问题是各系统的创建顺序,很直观的一个例子,音效系统的配置参数需要访问数据配置系统,数据配置系统又需要通过资源管理系统读取对应的全局配置表,所以创建顺序应该是先资源管理系统->数据配置系统->音效系统。如果通过Awake()去完成创建,维护创建的顺序就会变得很困难。使用一个脚本控制创建流程是较好的解决办法。
  GameManager的主要任务就是维护模块创建顺序,维护各模块的生命周期,传递unity内的生命周期函数。

使用

声明一个模块或系统

  继承IMonoManager接口,并实现接口函数。(模块内通过接口函数去访问unity内生命周期函数,GameManager中会实现对应的生命周期函数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

public class AssetManager : IMonoManager
{
public void OnInit()
{
}

public void Update()
{
}

public void FixedUpdate()
{
}

public void LateUpdate()
{
}

public void OnClear()
{
}
}

GameManager中注册对应模块或系统

  向GameManager的Awake()中声明需求模块,即可完成需求模块的创建时机和生命周期函数的实现。

1
2
3
4
5
6
7
8
public class GameManager
{
protected override void Awake()
{
// ……在AssetManager创建前创建的其他模块
_managerList.Add(AssetManager.Instance);
// ……在AssetManager创建后创建的其他模块
}

版本管理功能

  由于版本管理需求暂时未有太大内容量,故在GameManager中进行,后续可以进行模块化设计。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class GameManager
{
private static void VersionControl()
{
// ……版本检测
if (lastVersion.Equals(nowVersion))
{
// 此处写当前版本逻辑
return;
}
// 此处写非当前版本逻辑
}
}

内部实现

GameManager中维护一个IMonoManager列表

1
private readonly List<IMonoManager> _managerList = new List<IMonoManager>();

GameManager是继承自mono的,场景中会有实例化的GameManager对象,通过自身Update等unity内的生命周期函数去派发ImonoManager列表内各模块的接口函数。
以Update()函数的实现和派发举例:

1
2
3
4
5
6
7
private void Update()
{
foreach (var manager in _managerList)
{
manager.Update();
}
}