思考并回答以下问题:
客户端框架
关于Unity的架构有如下几种常用的方式。
**1.EmptyGO(空对象逻辑管理)**在Hierarchy上创建一个空的GameObject,然后挂上所有与GameObject无关的逻辑控制的脚本。使用GameObject.Find()访问对象数据。
缺点:逻辑代码散落在各处,不适合大型项目。
**2.Simple GameManager(单例游戏管理)** 所有与GameObject无关的逻辑都放在一个单例中。 缺点:单一文件过于庞大。 **3.Manager of Managers(“管理器”的管理)**将不同的功能单独管理。如下:
- MainManager:作为入口管理器。
- EventManager:事件(消息)管理器。
- UIManager:UI管理器。
- AudioManager:音频管理器。
- MenuManager:菜单管理器。
- PoolManager:对象缓冲池管理器(减少动态开辟内存消耗,减少GC)。
- GameManager:游戏管理。
- LevelManager:关卡管理器。
- SaveManager:存储与调用配置管理器。
实现一个简单的PoolManager1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47// 存储可动用的GameObject
// dormant 休眠的;蛰伏的;暂停活动的;
private List<GameObject> dormantObjects = new List<GameObject>();
// 在dormantObjects获取与go类型相同的GameObject,如果没有则new一个。
public GameObject Spawn(GameObject go)
{
GameObject temp = null;
if (dormantObjects.Count > 0)
{
foreach (GameObject dob in dormantObjects)
{
if (dob.name == go.name)
{
// Find an available GameObject
temp = dob;
dormantObjects.Remove(temp);
return temp;
}
}
}
// Now Instantiate a new GameObject.
temp = GameObject.Instantialte(go) as GameObject;
temp.name = go.name;
return temp;
}
// 将用完的GameObject放入dormantObjects中
public void Despawn(GameObject go)
{
go.transform.parent = PoolManager.transform;
go.SetActive(false);
dormantObject.Add(go);
Trim();
}
// FIFO 如果dormantObjects大于最大个数则将之前的GameObject都推出来。
public void Trim()
{
while (dormantObjects.Count > Capacity)
{
GameObject dob = dormantObjects[0];
dormantObjects.RemoveAt(0);
Destroy(dob);
}
}
缺点:
- 不能管理prefabs。
- 没有进行分类。
更好的实现方式是将一个PoolManager分成:
- 若干个SpawnPool。
- 每个SpawnPool分成PrefabPool和PoolManager。
- PrefabPool负责Prefab的加载和卸载。
- PoolManager与之前的PoolMananger功能一样,负责GameObject的Spawn、Despawn和Trim。
要注意的是:
- 每个SpawnPool是EmptyGO。
- 每个PoolManager管理两个List(Active,Deactive)。
有一个NB的插件叫Pool Manager。
LevelManager:关卡管理。
推荐插件:MadLevelManager。
SaveManager:配置管理。
实现Resume,功能玩到一半数据临时存储。
推荐SaveManager插件。可以Load、Save均采用二进制(快!!!)
所有C#类型都可以做Serialize。
数据混淆,截屏操作。
MVC(MVCS):较知名开源框架:PureMVC、StrangeIOC
MVVM:uFrame 图形化操作框架
StrangeIOC
StrangeIOC是一个开源的免费项目。最基本的思想就是“Binding”(绑定)。
基本架构:1
IBinder.Bind<Key>().To<Value>();
由这个Key去触发这个Value。
StrangeIoC是依据控制反转和解耦原理设计的,支持依赖注入。
控制反转即IoC(Inversion of Control):把传统上由程序代码操控的对象的调用权交给容器管理。
总结使用“框架”总体的优势
- 1:项目耦合性低,复用性高。
- 2:相对于复杂多变的需求变化、一般业务逻辑编写都相对固定(位置固定、方式固定),减轻了复杂项目对程序员“功力”的要求,特别适合中大型项目以及需求变更频繁的情况。