Unity MVC : Model View Controller 模型视图控制器框架

MVC的架构的种类有很多,主要用在大公司大项目上。
因为使用这个框架会要做很多解耦,在后期更容易维护,移植。

M Model 数据更新,数据存储
V View 视图显示 视图按钮通知
C Control 控制 对视图和数据进行交互,可以认为是这两个层级的中介者,控制者

需要注意的是 Mode一定要区分 数据存储对象,和数据更新的对象
View 同样也要区分 视图UI 和 按钮(人)交互 UI
它们的执行顺序是不同的,
一般来说,玩家可以通过按钮UI,然后更新数据,更新完数据之后,又返回更新UI显示

大致就是这样的流程,不过实现起来又有很多种方式
这里使用一种通知方式(使用事件)

Model


public class TheModel : MonoBehaviour {

    //当model数据发生改变以事件的形式让View进行刷新
    public TheData theData = new TheData();

    public delegate void MyDelegate(TheData data);
    public event MyDelegate MyEvent;

    public void SetHp(int hp){
        this.theData.HP += hp;
        DoEvent ();
    }

    public void SetMp(int mp){
        this.theData.MP += mp;
        DoEvent ();
    }

    public void DoEvent(){
        if (MyEvent != null) {
            MyEvent (theData);//发布事件
        }
    }
}
public class TheData{
    public int HP = 0;
    public int MP = 0;
}

View


public class TheView : MonoBehaviour {

    private Text hpText;
    private Text mpText;

    private Button hpBtn;
    private Button mpBtn;

    void Awake(){
        hpText = transform.Find ("HPText").GetComponent<Text> ();
        mpText = transform.Find ("MPText").GetComponent<Text> ();
        hpBtn = transform.Find ("UpHPBtn").GetComponent<Button> ();
        mpBtn = transform.Find ("UpMPBtn").GetComponent<Button> ();

        hpBtn.onClick.AddListener (TheController.instance.UpHP);
        mpBtn.onClick.AddListener (TheController.instance.UpMP);

    }
    //订阅者方法
    public void UpdateUI(TheData data){
        //更新UI
        hpText.text = data.HP.ToString ();
        mpText.text = data.MP.ToString ();
    }
}

Controller


public class TheController : MonoBehaviour {

    public static TheController instance;

    private TheModel theModel;
    private TheView theView;

    void Awake(){
        instance = this;
        theModel = GetComponent<TheModel> ();
        theView = GameObject.Find ("Canvas").GetComponent<TheView> ();
    }
    void Start(){
        theModel.MyEvent += theView.UpdateUI;//设置订阅者
    }

    public void UpHP(){
        theModel.SetHp (1);
    }

    public void UpMP(){
        theModel.SetMp (2);
    }
}

从上面的代码看出,这里的View 类专门做显示,没有数据更新,只跟Controller类关联
Model类只做数据更新 也只跟Controller类关联
而Controller类本身并没有对Model类和View类进行太多操作,仅仅是根据对象引用互相调它们的方法。

总结MVC大致的实现流程:

初始化:
初始化UI组件更新UI显示,控制类设置发布者,订阅者

theModel.MyEvent += theView.UpdateUI;//设置订阅者

之后:
我们假设点击按钮(UI交互),此时就在控制者类的数据类对象引用调用更新数据方法
数据更新完毕,就发布事件,让订阅者(UI显示类型)进行更新。

委托事件类型的参数是Data类型的对象(存储数据类对象),这样方法调用的时候就可以传入当前的实时数据。

通过事件发布的形式,可以避免程序一直使用if 来判断,可以减少在Update里的执行次数,从而做到了性能优化。

更复杂点的实现方式 https://blog.csdn.net/liaoshengg/article/details/82154516

猜你喜欢

转载自blog.csdn.net/liaoshengg/article/details/82150287
今日推荐