# 设计目的
- 解决功能切换时管理混乱.(例如:在主城时 npc 功能在允许,切换到背包功能后 npc 功能暂停)
- ui 显示隐藏的管理混乱.(当功能切换时可能有共同的 ui, 控制需要的 ui 显示不需要的隐藏)
- 解决 ui 之间的层级管理混乱.(在 A 功能 ui 显示层级可能是 a-b-c, 但在 B 功能 ui 显示层级需要为 b-c-a)
- 优化加载速度和内存占用.(进入场景时加载默认的功能,即主城功能。默认功能加载完毕即可游玩。可以配置场景全部功能。当空闲时加载资源。也可以指定所有 cv 的弹出策略。例如:某个 cv 在 60s 内没有访问,销毁 cv 并释放资源)
# 配置方式
SceneConfig = { | |
[0] = { | |
DefaultManagerCtrl = 'patching'; | |
AllCtrl = { | |
'patching', | |
'login', | |
} | |
} | |
} | |
CtrlConfig = { | |
['patching'] = { | |
Dependencies = { | |
}, | |
AllowPush = { | |
{ name = "Loading2" , priority = 99 }, | |
{ name = "loadingTown" , priority = 199 }, | |
}, | |
WindowType = WINDOW.TYPE.NORMAL, | |
WindowStyle = WINDOW.STYLE.FULL, | |
Feature = CTRL.FEATURE.MANAGER, | |
CreateMode = CREATE_CONTROLLER_TYPE.SINGLE, | |
}, | |
['languageChoose'] = { | |
WindowType = WINDOW.TYPE.NONE, | |
WindowStyle = WINDOW.STYLE.TRANSPARENT, | |
Feature = CTRL.FEATURE.COMPONENT, | |
CreateMode = CREATE_CONTROLLER_TYPE.SINGLE, | |
}, | |
['loginAreaSceneLoader'] = { | |
WindowType = WINDOW.TYPE.NONE, | |
WindowStyle = WINDOW.STYLE.TRANSPARENT, | |
Feature = CTRL.FEATURE.COMPONENT, | |
CreateMode = CREATE_CONTROLLER_TYPE.SINGLE, | |
}, | |
['Loading2'] = { | |
WindowType = WINDOW.TYPE.MASK, | |
WindowStyle = WINDOW.STYLE.TRANSLUCENT, | |
Feature = CTRL.FEATURE.UI, | |
CreateMode = CREATE_CONTROLLER_TYPE.SINGLE, | |
}, | |
['loadingTown'] = { | |
WindowType = WINDOW.TYPE.MASK, | |
WindowStyle = WINDOW.STYLE.FULL, | |
Feature = CTRL.FEATURE.UI, | |
CreateMode = CREATE_CONTROLLER_TYPE.SINGLE, | |
}, | |
['login'] = { | |
Dependencies = { | |
{ name = "loginAreaSceneLoader", params = {} }, | |
{ name = "languageChoose" , params = {} } | |
}, | |
AllowPush = { | |
{ name = "loginAreaSceneLoader" , priority = 0 }, | |
{ name = "languageChoose" , priority = 1 }, | |
{ name = "Loading2" , priority = 99 }, | |
{ name = "loadingTown" , priority = 199 }, | |
}, | |
WindowType = WINDOW.TYPE.NORMAL, | |
WindowStyle = WINDOW.STYLE.FULL, | |
Feature = CTRL.FEATURE.MANAGER, | |
CreateMode = CREATE_CONTROLLER_TYPE.SINGLE, | |
} | |
} |
SceneConfig:
- DefaultManagerCtrl : 切换当前区域时默认入栈的 ctrl
- AllCtrl: 当前区域需要加载的 ctrl (目前没用,之后可以考虑做空闲时间异步加载未加载的 mainCtrl)
CtrlConfig:
- Dependencies: 只有 Feature 为 Manager 字段才有效 表示 ctrl 加载时需要的依赖(在 awake 加载依赖)
- WindowType: 随便写 现在先不用.
- WindowStyle:
- Full : 表示全屏。会让他所在的 manager 中 他下面的所有 c'v 全部暂停 (会调用每个 ctrl 的 onAllPause)
- TRANSPARENT: 表示透明。不会影响其他 cv.
- TRANSLUCENT: 表示半透明。会让他所在的 manager 中 他下面的所有 ctrl 暂停 view 不受影响 (会调用每个 ctrl 的 onLogicPause)
- Feature: 目前只区分是 Manager 和非 Manager。会影响 push 和 pop 的规则
- CreateMode: 创建 cv 时候 单例模式 或 非单例模式
- AllowPush: 只有 Feature 为 Manager 字段才有效 表示当前 Manager 允许 push 的 cv 和 cv 在链表中的位置(对应 cv 的 ui 层级)注意:Dependencies 中的 ctrl 也必须在这里填写.
# 数据结构
- 采用双层双向链表加数组的数据结构
# 流程图
push: 创建一个 cv
onPushDone: 因为创建 cv 是个异步操作所以工作状态设置为创建完毕后根据数据设置
pop: 弹出一个 cv 不一定会销毁
# 注意事项
- 只有 Manager 拥有 push 和 pop 的权限。由 manager 将权限分发给子节点 cv.
- 子节点间不存在交互。如果是数据驱动框架直接数据层访问。如果是事件驱动框架由 Manager 调度.
- Manager 没有 view 层,只负责功能组合和创建销毁. Manager 直接也不存在交互.