当前位置: 首页 > 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.lryc.cn/news/616273.html

相关文章:

  • 计算机网络---IP(互联网协议)
  • 学习分库分表的前置知识:高可用系统架构理论与实践
  • Android视图回调机制:从post到ViewTreeObserver,从源码分析到最佳实践
  • java组件漏洞
  • 【在线五子棋对战】十二、http请求处理
  • 从 GPT‑2 到 gpt‑oss:解析架构的迭代
  • C++移动语义、完美转发及编译器优化零拷贝
  • win11(RTX5060)下进行nanodetplus训练
  • 2025年全国青少年信息素养大赛Scratch编程践挑战赛-小低组-初赛-模拟题
  • 动态工作流:目标结构源自表
  • 红楼梦文本数据分析
  • SpringBoot实现文件上传
  • CART算法:Gini指数
  • sqli-labs-master/Less-62~Less-65
  • 人工智能正在学习自我提升的方式
  • 《算法导论》第 17 章 - 摊还分析
  • 谷歌DeepMind发布Genie 3:通用型世界模型,可生成前所未有多样化的交互式虚拟环境
  • UE什么贴图要关闭SRGB
  • Virtio 驱动初始化数据收发流程详解
  • 太极行业观察:从传统技艺到数字化转型的演变|创客匠人
  • 【R studio数据分析】准备工作——下载安装
  • 【布局适配问题】响应式布局、移动端适配、大屏布局要点
  • 通过sealos工具在ubuntu 24.02上安装k8s集群
  • Loki+Alloy+Grafana构建轻量级的日志分析系统
  • FFmpeg实现音视频转码
  • Spring AOP 底层实现(面试重点难点)
  • AQS(AbstractQueuedSynchronizer)底层源码实现与设计思想
  • 前端路由:Hash 模式与 History 模式深度解析
  • Java Stream流详解:从基础语法到实战应用
  • Rust 实战四 | Traui2+Vue3+Rspack 开发桌面应用:通配符掩码计算器