Unity开发小型游戏中如何便捷使用PureMVC框架
http://www.manew.com/thread-96477-1-1.html
(出处: -【游戏蛮牛】-虚拟现实,unity3d,unity3d教程下载首选u3d,unity3d官网)
http://www.manew.com/thread-96477-1-1.html
(出处: -【游戏蛮牛】-虚拟现实,unity3d,unity3d教程下载首选u3d,unity3d官网)
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:
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public
class
Controller {
// view -> mediator -> controller
public
virtual
void
Execute(
object
args =
null
) {
// todo
}
// controller -> mediator -> view
public
void
sendEvent(
string
eventName,
object
args =
null
) {
Mediator.SendNotification(eventName, args);
}
// 作为一个Controller, 在获取某个模型, 或者添加新的模型时
// 需要Controller提供一些方法, 向池子中注册一个模型对象
public
void
RegsiterModel(Model mode) {
Mediator.RegisterModel(mode);
}
// 向池子中注册一个视图对象
public
void
RegisterView(View view) {
Mediator.RegisterView(view);
}
// 向用户返回View 和Model的方法
public
T GetModel<T>() where T : Model {
return
Mediator.GetModel<T>();
}
public
T GetView<T>() where T : View {
return
Mediator.GetView<T>();
}
}
|
View:
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
using
UnityEngine;
public
class
View : MonoBehaviour {
public
string
Name {
get
;
set
;
}
// 一旦满足条件后, 第一次事件委托
// view -> mediator -> controller
public
void
SendEvent(
string
eventName,
object
args =
null
) {
Mediator.SendNotification(eventName, args);
}
// view自己的事情
public
virtual
void
DoSth() {
}
}
|
Model:
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
public
class
Model {
public
string
Name {
get
;
set
;
}
public
void
SendEvent(
string
eventName,
object
args =
null
) {
Mediator.SendNotification(eventName, args);
}
// Model Todo Sth
public
virtual
void
DoSth() {
}
}
|
Mediator View的调节者类:
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
using
System.Collections.Generic;
using
System;
// Mediator View的调节者类
public
static
class
Mediator {
private
static
Dictionary<
string
, Model> m_model =
new
Dictionary<
string
, Model>();
private
static
Dictionary<
string
, View> m_views =
new
Dictionary<
string
, View>();
private
static
Dictionary<
string
, Type> m_commands =
new
Dictionary<
string
, Type>();
public
static
void
SendNotification(
string
eventName,
object
args =
null
) {
if
(m_commands.ContainsKey(eventName)) {
Controller ctrl = Activator.CreateInstance(m_commands[eventName])
as
Controller;
ctrl.Execute(args);
}
}
// 提供向三个池子添加对象方法
public
static
void
RegisterModel(Model mode) {
m_model[mode.Name] = mode;
}
public
static
void
RegisterView (View view) {
m_views[view.Name] = view;
}
// 返回View 和 Model
public
static
T GetModel<T> () where T : Model {
foreach
(Model m
in
m_model.Values) {
if
(m
is
T) {
return
m
as
T;
}
}
return
null
;
}
public
static
T GetView<T>() where T : View {
foreach
(View v
in
m_views.Values) {
if
(v
is
T) {
return
v
as
T;
}
}
return
null
;
}
}
|