Flower Defense—UIFacade

UIFacade 是 UI 系统的外观类,属于外观模式。

复制代码
GameController / SceneState
          ↓
       UIFacade
     ┌────┼────┐
 UIManager  Panel  Factory
     │       │      │
  面板字典  UI显示  资源加载

它对外提供统一的 UI 操作入口,把 UIManager、Panel、Factory、AudioManager 和场景状态切换等多个子系统封装起来。外部代码只需要通过 UIFacade 进行面板添加、创建、销毁、场景切换和资源获取,不需要直接依赖这些具体模块。

在 Flower Defense 中,UIFacade 还负责场景切换时的黑幕动画、当前面板字典管理,以及将 UI 面板放回对象池。这样可以降低 UI 模块之间的耦合,让场景切换和 UI 资源管理更加统一。


它主要负责什么?

1. 管理场景状态切换

cs 复制代码
public void ChangeSceneState(IBaseSceneState baseSceneState)
{
    lastSceneState = currentSceneState;
    ShowMask();
    currentSceneState = baseSceneState;
}

切换过程不是直接跳转,而是:

实际的 EnterScene() 和 ExitScene() 会由状态类负责。

2. 管理当前场景的 Panel

进入场景时,状态类会添加需要的面板:

cs 复制代码
mUIFacade.AddPanelToDict(StringManager.MainPanel);
mUIFacade.AddPanelToDict(StringManager.SetPanel);

UIFacade 再通过工厂获取对应的 Panel:

cs 复制代码
mUIManager.currentScenePanelDict.Add(
    uiPanelName,
    GetGameObjectResource(
        FactoryType.UIPanelFactory,
        uiPanelName
    )
);

进入场景后,`InitDict()` 会:

  • 将面板放到 Canvas 下;
  • 设置位置和缩放;
  • 获取 IBasePanel;
  • 调用面板初始化;
  • 加入当前场景面板字典。

离开场景时,`ClearDict()` 会:

  • 清理面板字典;
  • 把面板放回对象池;
  • 释放当前场景的 UI 资源。

3. 统一创建 UI

例如创建遮罩、按钮或其他 UI:

cs 复制代码
public GameObject CreateUIAndSetUIPosition(string uiName)
{
    GameObject itemGo =
        GetGameObjectResource(FactoryType.UIFactory, uiName);

    itemGo.transform.SetParent(canvasTransform);
    itemGo.transform.localPosition = Vector3.zero;
    itemGo.transform.localScale = Vector3.one;

    return itemGo;
}

4. 统一访问资源和音频

UIFacade 还对外提供:

cs 复制代码
GetSprite(...)
GetAudioSource(...)
GetRuntimeAnimatorController(...)
GetGameObjectResource(...)
PushGameObjectToFactory(...)

为什么需要 UIFacade?

如果没有 UIFacade,可能每个 Panel 都要直接依赖:

  • UIManager
  • GameManager
  • FactoryManager
  • AudioSourceManager
  • SceneState
  • Canvas

模块之间会产生很多耦合。

使用 UIFacade 后:外部只面对一个接口,内部子系统可以调整而不影响调用方。

复制代码
Panel / SceneState
        ↓
    UIFacade
        ↓
多个 UI 子系统

它和 UIManager 有什么区别?

UIManager = 管理 UI 数据和面板集合

UIFacade = 对外提供统一的 UI 操作入口

UIManager 更像内部管理者,负责保存当前场景的 Panel 字典。

UIFacade 更像对外服务层,负责协调:

  • 面板;
  • 场景状态;
  • UI 工厂;
  • Canvas;
  • 音频;
  • 转场动画。
相关推荐
呆呆敲代码的小Y1 小时前
【实战精选面试题】Unity精选面试题详细解答,按模块整理汇总
人工智能·游戏·unity·游戏引擎
小贺儿开发12 小时前
《流光绘忆》Unity 沉浸式光影互动
科技·unity·ai·程序员·工具·互动·光影
Aman198416 小时前
Claude Code做Unity项目移植(一):从零散工具到团队式
unity·游戏开发·vibe coding·claude code·项目迁移
地狱为王18 小时前
Unity使用VoxLock实现语音隔离
unity·游戏引擎·音频处理·voxlock
Jmyd012321 小时前
博物馆数字展厅系统架构设计:实景采集到云渲染全链路
unity·系统架构·博物馆·数字展厅·博物馆数字化
weixin_424294671 天前
对于未加入 Script Execution Order 的脚本
unity
暴走约伯1 天前
【VFX工具链源码拆解 03】告别机械劳动(下):材质字典映射批处理与智能纹理槽识别
unity·游戏引擎·材质
Wanda12141 天前
机器人与机电一体化3D数字孪生机器-Day9
人工智能·3d·unity·机器人·数字孪生
暴走约伯1 天前
【VFX工具链源码拆解 01】总体架构:大型项目特效流程的程序化落地
开发语言·经验分享·3d·unity·架构·游戏引擎