当前位置: 首页 > news >正文

MVC结构变种——第三章核心视图及控制器的整体逻辑

各组件职责与交互详解

1. View类 (UI视图基类)

核心职责

  • 管理UI基础元素:GameObject、Transform、Canvas等

  • 处理UI生命周期:Awake/OnEnable/OnDisable

  • 实现UI通用功能:分辨率适配(SetSize)、多语言支持(SetText)

  • 提供组件查找方法(GetComponent)

2. ViewController类 (视图控制器基类)

核心职责

  • 管理View的生命周期:Init/Open/Close

  • 实现单例模式:通过泛型T保证每个控制器唯一

  • 处理UI渲染顺序:ResetSortOrder/SetNavToTop

  • 管理UI状态:IsOpen/SetActive

关键流程:

3. ViewManager类 (视图管理中心)

核心职责

  • 集中初始化所有视图控制器

  • 提供全局更新事件(OnUpdate)

  • 管理全局UI渲染顺序(order计数器)

4. MainViewController/MainView (具体实现单一类型View及ViewController)

具体流程

  1. 初始化

    csharp// ViewManager初始化时
    MainViewController.Instance.Init("UI/MainCanvas", true, false);//ViewController<T, V> 类中创建实例及初始化
    public class ViewController<T, V> where T : new() where V : View, new()
    {static T instance = new T();public static T Instance => instance;bool open_nav_view;public V view;public void Init(string resPath, bool isAddUpdateListerner = false, bool stopAI_OnOpen = false, bool open_nav = false){view = new V();view.Init(resPath, isAddUpdateListerner, Close, stopAI_OnOpen);this.open_nav_view = open_nav;GameEvent.ResetSortOrder += ResetSortOrder;}
    • 创建MainView实例

      • MainViewController : ViewController<MainViewController, MainView> 只是定义了一个新类型;只是一个声明

      • 创建实例时第一次访问静态属性 `Instance` 的时候:
        在 MainViewController.Instance 第一次被访问(即执行到 MainViewController.Instance.Init(...))时,才创建 MainViewController 实例。

    • 设置资源路径和回调

  2. 打开界面

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;public class SceneController : MonoBehaviour
    {public void Load(string next){LoadingViewController.Instance.Open();LoginViewController.Instance.Close();StartCoroutine(LoadSceneAsync(next));}IEnumerator LoadSceneAsync(string next){……//打开主页面板MainViewController.Instance.Open();}
    }
    • 加载预制件资源(资源路径需要详细讲解)

      public void Open(){if (view.gameObject == null){//实例化该预制体,预制体路径存储在当前类型View参数中//因为是MainViewController.Instance.Open();所以这里是MainViewvar go = ResourcesManager.Instance.Instantiate<GameObject>(view.resPath);Debug.Log("view.resPath" + view.resPath);……view.canvas = go.GetComponent<Canvas>();view.cs = go.GetComponent<CanvasScaler>();}}public class ViewController<T, V> where T : new() where V : View, new()
      {public void Init(string resPath, bool isAddUpdateListerner = false, bool stopAI_OnOpen = false, bool open_nav = false){view = new V();view.Init(resPath, isAddUpdateListerner, Close, stopAI_OnOpen);//这里的view.init有viewManager控制,意思是在ViewManager执行初始化时,已经将对应路径通过对应Controller传参到对应View里面}
      }using System;
      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;public class ViewManager
      {static ViewManager instance = new ViewManager();public static ViewManager Instance => instance;public int order;public void Init(){……MainViewController.Instance.Init("UI/MainCanvas", true, false);//对应路径通过对应Controller传参到对应View里面}

    • 初始化Canvas组件

    • 触发OnEnable生命周期(在Open方法中)

      • public void Open(){if (view.gameObject == null){……SetActive(true);//在这里手动调用OnEnable生命周期……}else{//打开SetActive(true);}}

  3. 业务操作

    csharp// 游戏逻辑中
    MainViewController.Instance.UpdatePlayerHP(0.8f);
    csharp// MainViewController内部
    public void UpdatePlayerHP(float v) {view.UpdatePlayerHP(v); // 调用MainView的具体实现
    }
    • 控制器调用视图的具体方法

  4. 全局更新

    csharp// MainView.OnEnable中注册
    ViewManager.Instance.OnUpdate += Update;// MainView中实现
    public override void Update() {// 每帧更新UI逻辑
    }

http://www.dtcms.com/a/324885.html

相关文章:

  • idea中使用maven造成每次都打印日志
  • matlab实现随机森林算法
  • [SUCTF 2019]Pythonginx
  • JS中typeof与instanceof的区别
  • 【精彩回顾·成都】成都 User Group×柴火创客空间:开源硬件驱动 AI 与云的创新实践!
  • JS 注释类型
  • ADK[3]历史对话信息保存机制与构建多轮对话机器人
  • scanpy单细胞转录组python教程(四):单样本数据分析之降维聚类及细胞注释
  • 【Canvas与戳记】黑底金Z字
  • 正确使用SQL Server中的Hint(10)— 常用Hint(2)
  • Spring WebSocket安全认证与权限控制解析
  • 研究揭示 Apple Intelligence 数据处理中可能存在隐私漏洞
  • 【redis初阶】------List 列表类型
  • 通过脚本修改MATLAB的数据字典
  • 【15】OpenCV C++实战篇——fitEllipse椭圆拟合、 Ellipse()画椭圆
  • 【人工智能99问】BERT的原理什么?(23/99)
  • Elasticsearch 保姆级入门篇
  • SpringBoot查询方式全解析
  • 在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合
  • 数字图像处理2——图像增强
  • AI(1)-神经网络(正向传播与反向传播)
  • 【RL第七篇】PPO训练策略,如何使PPO训练稳定?
  • unity中如何让原人物动画兼容新人物的动画
  • 异步问题的概念和消除问题技巧
  • Graph-R1:一种用于结构化多轮推理的智能图谱检索框架,并结合端到端强化学习
  • 【面板数据】全国及各省份技术市场成交额数据-dta+xlsx格式(2001-2023年)
  • nginx+lua+redis案例
  • 《Webpack与Vite热模块替换机制深度剖析与策略抉择》
  • 消息生态系统全景解析:技术架构、核心组件与应用场景
  • 【Python练习】085. 编写一个函数,实现简单的DNS服务器功能