【GamePlay】MVC UI框架设计

前言

如果所有UI逻辑都写到一个ViewMonoBehavior里,逻辑数据展示混合在一起,看起来就不好维护。

UI开发需要定义一个规范,把数据、视图和逻辑控制分开,这样就清晰很多,也统一了制作流程,MVC框架在这里就很适合。

不过我看了几个开源的框架,关于MVC的用法都不太一样,主要是三者的调用关系不同,每个都能用,看自己的习惯吧。下面这个是我觉得使用起来逻辑比较清晰的一套。

MVC

Model 只存数据
View 是Mono脚本,只对视图控件进行操作,持有对Model和Controller的引用
Controller 是对UI的控制,每个UI模块一个Controller。持有Model和View。

Controller 持有数据,负责对数据进行初始化。提供ShowXxxView()和CloseXxxView()方法,用来打开View视图,在打开的过程中,初始化视图预制体,然后把数据传给视图调用,视图初始化和更新流程。打开视图逻辑大致如下。一个Controller可以控制多个View,比如在当前页面打开一个子页面。

public void ShowXxxView(){
    
    
	view = UIManager.Instance.ShowView((int)ViewId.XxxUI) as XxxView;
    if (view != null)
    {
    
    
        view .SetController(this);
        view .SetModel(mModelData);
        view .Initialize();
        view .UpdateView();
    }
}

View 持有model数据用来给控件赋值。是由controller用来做一些逻辑。比如点击某些按钮的时候,需要打开其他视图。都调用Controller来处理,而不在view里面做逻辑。 View只负责显示。 Vivo是model脚本,挂在对应的UI预制体上。

Model不能有逻辑,只能有对数据的操作。 Model.的数据也是由controller来赋值。如果是直接读存储,就读成功之后给model赋值,如果是发送网络请求,在网络请求响应中给Model赋值。

QFramework实现MVC UI框架

可以想一下,用QFramework,怎么实现一个mvc ui框架。

主要用到了QFramework中的 controller model system.

model还是数据层不变。
controller 定义一些ViewController 作为视图层。挂载到对应视图的预制体上。
System作为控制层。管理model数据。通过UIManager获得对应的视图ViewController。提供打开界面关闭界面的方法。
UIManager 需要自己实现。主要就是实现打开UI时的UI实例化,获得对应UI的ViewController脚本。

或者像下图这样,View不继承Mono脚本,这样就不能拖控件挂物体了,只能通过Find查找子组件。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LvPartner/article/details/128171543
今日推荐