Unity中的MVC框架
1.图片解析
2.个人总结MVC框架各个模块的代码
单列模块MonoSingleton用于结局平凡的使用单列带来的繁琐。
public class MonoSingleton<T> : MonoBehaviour
where T:MonoBehaviour
{
private static T m_Instance;
public static T Instance
{
get
{
return m_Instance;
}
}
protected virtual void Awake()
{
m_Instance = this as T;
}
}
MVC基类基本的调用方法我都是放在这里的
public static class MVC
{
public static Dictionary<String, Model> Models = new Dictionary<string, Model>();//名字--model
public static Dictionary<string, View> Views = new Dictionary<string, View>();//名字--view
public static Dictionary<string, Type> CommandMap = new Dictionary<string, Type>();//名字--事件
//注册View
public static void RegisterView(View view)
{
//防止重复注册
if(Views.ContainsKey(view.name))
{
Views.Remove(view.name);
}
view.RegisterAttentionEvent();
Views[view.Name] = view;
}
//注册Model
public static void RegisterModel(Model models)
{
Models[models.Name] = models;
}
//注册CommandMap
public static void RegisterController(string evebtName, Type controllerType)
{
CommandMap[evebtName] = controllerType;
}
//获取model
public static T GetModel<T>()
where T :Model
{
foreach (var m in Models.Values)
{
if(m is T)
{
return (T)m;
}
}
return null;
}
//获取View
public static T GetView<T>()
where T : View
{
foreach (var v in Views.Values)
{
if (v is T)
{
return (T)v;
}
}
return null;
}
//发送事件
public static void SendEvent(string eventname,object data=null )
{
if (CommandMap.ContainsKey(eventname))
{
Type T = CommandMap[eventname];
//控制器创建
Controller C = Activator.CreateInstance(T) as Controller;
C.Execute(data);
}
//view处理
foreach (var v in Views.Values)
{
if (v.AttentionList.Contains(eventname))
{
//执行
v.HandeEvent(eventname, data);
}
}
}
}
View 解释模型,模型更新请求,发送用户输入给我控制器,允许控制器选择视图;
using System.Collections.Generic;
using UnityEngine;
public abstract class View : MonoBehaviour
{
//通过名字存储到游戏中(游戏标识)
public abstract string Name { get; }
//事件关系列表
[HideInInspector]
public List<string> AttentionList = new List<string>();
//注册事件
public virtual void RegisterAttentionEvent()
{
}
//处理事件
public abstract void HandeEvent(string name, object data) ;
//发送事件
protected void SendEvent(string eventName, object data = null)
{
MVC.SendEvent(eventName, data);
}
//获取模型
protected T GetModel<T>()
where T : Model
{
return MVC.GetModel<T>() as T;
}
}
Model功能:封装应用程序状态,相应查询,应用程序功能通知视图改变
public abstract class Model
{
//名字标标识
public abstract string Name { get; }
//发送事件
protected void SendEvent(string eventName,object data=null)
{
MVC.SendEvent(eventName, data);
}
}
Controller:定义程序行为,用户动作映射,模型更新,响应视图
public abstract class Controller
{
//执行事件
public abstract void Execute(object dath);
//获取模型
protected T GetModel<T>()
where T : Model
{
return MVC.GetModel<T>() as T;
}
//获取视图
protected T GetView<T>()
where T : View
{
return MVC.GetView<T>() as T;
}
//注册模型
protected void RegisterModel(Model model)
{
MVC.RegisterModel(model);
}
//注册视图
protected void RegisterView(View view)
{
MVC.RegisterView(view);
}
//注册控制器
protected void RegisterController(string eventName,Type contorllerType)
{
MVC.RegisterController(eventName, contorllerType);
}
}
本框架来源于一个大二的学生,不喜勿喷,个人总结。