Unity开发小型游戏中如何便捷使用PureMVC框架

来源:互联网 发布:韩火火的淘宝店网址 编辑:程序博客网 时间:2024/05/23 00:46
Unity开发小型游戏中如何便捷使用PureMVC框架

PureMVC 是经典MVC设计框架的一个变种, Pure的含义是纯粹的,精粹的, PureMVC顾名思义被称为"纯粹的MVC框架".

在介绍PureMVC之前, 我们先来回顾一下MVC的设计框架, MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建应用程序的框架:


Model(模型)表示应用程序核心(比如数据库记录列表)。通常模型对象负责在数据库中存取数据或者处理网络数据。
View(视图)显示数据(数据库记录)。通常视图是依据模型数据创建的。
Controller(控制器)处理输入(写入数据库记录)。 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC 框架同时提供了对多平台完全支持控制。分层的同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
        MVC框架具有重用性高, 耦合度性低, 开发周期短, 部署快, 可维护性高等优点. 尤其是简化了分组开发的特点, 在学生们项目期阶段, 优势尤为明显.
        同样,MVC也有缺点, 在规模不大的工程开发时, 显得大材小用且代码量繁重. 尤其是在同学们分组做项目时, 这么大的框架往往不适合短期开发.
为此, 我们今天的PureMVC能够最大限度的减少MVC之间的耦合性, 它基于MVC继续向前发展, 以下是其基本节点关系:

由图可知, 在MVC框架基础上, 在节点之间关系做了如下调整:
1.Proxy(代理) 相当于经典MVC中的Model.它将代理Model的所有职权。负责维护和操作应用程序的数据模型。Proxy通常情况下会暴露一组公共API供Controller(command)或View(mediator)调用,以获取、修改或更新程序数据。注意Proxy只可以发送通知,不可以也不应该让它接收通知。
2. Mediator(中介) 对应MVC中的View.它接管了View的所有职权,负责数据内容的视图呈现和捕获用户输入。Mediator管理者View Component, Mediator可以监听View Component发出的Event,它通过这些事件监听捕获用户输入。Mediator可以接收或发送通知,以跟Controller(Command)或其他Mediator交流。Mediator用于Model(Proxy)对外暴露的公共API操控Model(Proxy);
3. Command(命令)。它相当于一个指挥部,负责协调调度PureMVC中的Proxy和Mediator以转发通知。Command以接收或发送通知的方式跟View(Mediator)或其他Command通信,用Model(Proxy)暴露的公共API操控Model(Proxy).
4.  Façade(经纪人)   在PureMVC中,M、V、C都是被作为单例封装在Façade类中的,他们对外不可见。在使用PureMVC框架的时候,不需要去创建Model、View和Controller,只需要创建一个Façade的单例,它就会自动创建出M、V、C这三个核心模块,并且为他们建立起通信机制。我们只要调用Façade暴露出来的公共方法就可以启动整个程序,所有的消息流转都在Façade内部完成。
5. View Component 是PureMvc框架中真正的可视元素,例如一个影片剪辑或一个按钮等。它通过事件与Mediator交流。通过向外暴露的API供Mediator操作。
6. Data Object  PureMVC框架中真正的数据,它可以是一个数值对象、一个集合或是一数据库。它通过Proxy的构造函数传入Proxy,并被一个名为data的属性引用。
在Uniyt开发的小型游戏过程中, PureMVC框架仍然显得略微庞大, 在此我为大家提供一种较为便捷的代码案例:

Controller:
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class Controller {  
  2.     // view -> mediator -> controller  
  3.     public virtual void Execute(object args = null) {  
  4.         // todo  
  5. }  
  6.    
  7.     // controller -> mediator -> view  
  8.     public void sendEvent(string eventName, object args = null) {  
  9.         Mediator.SendNotification(eventName, args);  
  10.     }  
  11.    
  12.     // 作为一个Controller, 在获取某个模型, 或者添加新的模型时  
  13.     // 需要Controller提供一些方法, 向池子中注册一个模型对象  
  14.     public void RegsiterModel(Model mode) {  
  15.         Mediator.RegisterModel(mode);  
  16.     }  
  17.     // 向池子中注册一个视图对象  
  18.     public void RegisterView(View view) {  
  19.         Mediator.RegisterView(view);  
  20.     }  
  21.    
  22.     // 向用户返回View 和Model的方法  
  23.     public T GetModel<T>() where T : Model {  
  24.         return Mediator.GetModel<T>();  
  25.     }  
  26.     public T GetView<T>() where T : View {  
  27.         return Mediator.GetView<T>();  
  28.     }  
  29. }  

Controller:
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. using UnityEngine;  
  2.    
  3. public class View : MonoBehaviour {  
  4.     public string Name {  
  5.         get;  
  6.         set;  
  7.     }  
  8.    
  9.     // 一旦满足条件后, 第一次事件委托  
  10.     // view -> mediator -> controller  
  11.     public void SendEvent(string eventName, object args = null) {  
  12.         Mediator.SendNotification(eventName, args);  
  13.     }  
  14.    
  15.     // view自己的事情  
  16.     public virtual void DoSth() {  
  17.    
  18.     }  
  19. }  

Model:
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class Model {  
  2.    
  3.     public string Name {  
  4.         get;  
  5.         set;  
  6.     }  
  7.    
  8.     public void SendEvent(string eventName, object args = null) {  
  9.         Mediator.SendNotification(eventName, args);  
  10.     }  
  11.    
  12.     // Model Todo Sth  
  13.     public virtual void DoSth() {  
  14.    
  15.     }  
  16. }  

Mediator View调节者类:
[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. using System.Collections.Generic;  
  2. using System;  
  3. // Mediator View的调节者类  
  4. public static class Mediator {  
  5.     private static Dictionary<string, Model> m_model = new Dictionary<string, Model>();  
  6.     private static Dictionary<string, View> m_views = new Dictionary<string , View>();  
  7.     private static Dictionary<string, Type> m_commands = new Dictionary<string, Type>();  
  8.    
  9.     public static void SendNotification(string eventName, object args = null) {  
  10.         if (m_commands.ContainsKey(eventName)) {  
  11.             Controller ctrl = Activator.CreateInstance(m_commands[eventName]) as Controller;  
  12.             ctrl.Execute(args);  
  13.         }  
  14.     }  
  15.    
  16.     // 提供向三个池子添加对象方法  
  17.     public static void RegisterModel(Model mode) {  
  18.         m_model[mode.Name] = mode;  
  19.     }  
  20.     public static void RegisterView (View view) {  
  21.         m_views[view.Name] = view;  
  22.     }  
  23.    
  24.     // 返回View 和 Model  
  25.     public static T GetModel<T> () where T : Model {  
  26.         foreach (Model m in m_model.Values) {  
  27.             if (m is T) {  
  28.                 return m as T;  
  29.             }  
  30.         }  
  31.         return null;  
  32.     }  
  33.    
  34.     public static T GetView<T>() where T : View {  
  35.         foreach (View v in m_views.Values) {  
  36.             if (v is T) {  
  37.                 return v as T;  
  38.             }  
  39.         }  
  40.         return null;  
  41.     }  
  42. }  


欢迎试听我的免费课程:unity3D-游戏/AR/VR在线就业班 C#入门:http://edu.csdn.net/course/detail/1982

0 0
原创粉丝点击