# 设计目的

  • 解决功能切换时管理混乱.(例如:在主城时 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 直接也不存在交互.
更新于 阅读次数