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