文档章节

unity3d + PureMVC框架搭建

小房小田
 小房小田
发布于 2016/01/12 19:38
字数 766
阅读 2686
收藏 4

0、流程:LoginView-SendNotification()---->LoginCommand--Execute()--->调用proxy中的函数操作模型数据--LoginProxy---->接收服务器返回-操作数据-返回通知视图控制器--LoginMediator--->操作视图。

(虽然很繁琐,一个功能需要写很多个文件,但是对于大型项目来说使用起来是很舒服的。比如A复制背包,B复制商场,这里都需要用到人物的金币信息,对与A/B来说我只要监听到了金币更新的操作,我就通过视图控制器来做update操作就可以了,不关心是谁的操作引起的金币变化。好处就不多说了,看下面代码吧)


1、下载puremvc,http://www.puremvc.org/

2、复制puremvc源代码到项目scripts目录下

3、AppFacade.cs文件,这是puremvc的启动文件

using UnityEngine;
using System.Collections;
using PureMVC.Patterns;
using PureMVC.Interfaces;
public class AppFacade : Facade,IFacade {
	public const string STARTUP = "starup";
	public const string LOGIN = "login";
	private static AppFacade _instance;
	public static AppFacade getInstance
	{
		get{ 
			if (_instance == null) {
				_instance = new AppFacade ();
			}
			return _instance;
		}
	}
	protected override void InitializeController ()
	{
		base.InitializeController ();
		RegisterCommand (STARTUP, typeof(StartupCommand));
		RegisterCommand (NotiConst.S_LOGIN, typeof(LoginCommand));
	}
	public void startup()
	{
		SendNotification (STARTUP);
	}
}

4、在场景中创建一个GameManager.cs文件,挂在Main Camera上

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {

	// Use this for initialization
	void Start () {
		DontDestroyOnLoad (this.gameObject);
		AppFacade.getInstance.startup ();
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

5、编写StartupCommand.cs文件,在这里注册所有的command。

using UnityEngine;
using System.Collections;
using PureMVC.Patterns;

public class StartupCommand : MacroCommand {
	protected override void InitializeMacroCommand ()
	{
		AddSubCommand (typeof(ModelPreCommand));
	}

}

5、创建ModelPreCommand.cs文件,这里注册proxy文件。

// 创建Proxy,并注册。
public class ModelPreCommand : SimpleCommand {

    public override void Execute (PureMVC.Interfaces.INotification notification)
    {
        Facade.RegisterProxy (new LoginProxy());
    }
}

6、在AppFacade.cs文件InitializeController方法中注册消息号与Command直接的监听关系。这里使用了NotiConst来定义所有的消息号。

7、创建LoginView.cs这是一个视图文件,同时创建LoginViewMediator.cs文件。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using PureMVC.Patterns;
using PureMVC.Interfaces;

public class LoginViewMediator : Mediator,IMediator {

    public const string NAME = "LoginViewMediator";

    public LoginViewMediator(LoginView _view):base(NAME,_view){
        
    }
    //需要监听的消息号
    public override System.Collections.Generic.IList<string> ListNotificationInterests ()
    {
        List<string> list = new List<string>();
        list.Add (NotiConst.R_LOGIN);
        return list;
    }
    //接收消息到消息之后处理
    public override void HandleNotification (PureMVC.Interfaces.INotification notification)
    {
        string name = notification.Name;
        object vo = notification.Body;
        switch (name) {
        case NotiConst.R_LOGIN:
                (this.ViewComponent as LoginView).receiveMessage (vo);
                break;
        }
    }
}


LoginView.cs

void Start () {
//注册mediator
        AppFacade.getInstance.RegisterMediator (new LoginViewMediator (this));
    }

void OnDestory(){
        AppFacade.getInstance.RemoveMediator (LoginViewMediator.NAME);
    }


8、编写LoginCommand.cs文件,监听发送过来的消息。

在AppFacade里面InitializeController注册:RegisterCommand (NotiConst.S_LOGIN, typeof(LoginCommand));

using UnityEngine;
using System.Collections;
using PureMVC.Patterns;

public class LoginCommand : SimpleCommand {

    public override void Execute (PureMVC.Interfaces.INotification notification)
    {
        Debug.Log ("LoginCommand");
        object obj = notification.Body;
        LoginProxy loginProxy;
        loginProxy = Facade.RetrieveProxy (LoginProxy.NAME) as LoginProxy;
        string name = notification.Name;
        switch (name) {
        case NotiConst.S_LOGIN:
            loginProxy.sendLogin (obj);
            break;
        }
    }
}

9、创建LoginProxy.cs文件,这里复制数据处理,与服务器通讯等操作。

using UnityEngine;
using System.Collections;
using PureMVC.Patterns;
using PureMVC.Interfaces;
using LitJson;

public class LoginProxy : Proxy,IProxy {
    public const string NAME = "LoginProxy";
    // Use this for initialization
    public LoginProxy():base(NAME){}
    //请求登陆
    public void sendLogin(object data)
    {
        //与服务器通讯,返回消息处理玩之后,如果需要改变试图则调用下面消息
        receiveLogin();
    }
    // 登陆返回
    private void receiveLogin(JsonData rData)
    {
       SendNotification (NotiConst.R_LOGIN, rData);
    }
}

10、测试。在视图里面创建一个按钮点击按钮发送登陆消息。

void sendNotice(){
    int obj = 233333;
    AppFacade.getInstance.SendNotification (NotiConst.S_LOGIN,obj);
}

然后在写一个接收到服务器端返回数据的操作函数

public void receiveLogin(object obj){
    //下一步操作
}


© 著作权归作者所有

上一篇: Python入门
下一篇: Unity3d v5.3+protoBuf
小房小田
粉丝 13
博文 15
码字总数 10549
作品 0
朝阳
私信 提问
puremvc的网友评论

PureMVC,就如同它的名字是,它是一个纯粹的小巧的MVC框架,支持多语言。 PureMVC有一个名为Mediator的构造,顾名思义,它就是Mediator模式的实现,充当视图API和程序其余部分的API之间的中介...

红薯
2009/12/11
416
1
实战 PureMVC

PureMVC 是一个通用的 MVC 框架,广泛适用于多种语言多种平台,是一个成熟的、耦合性很低的优秀框架,本文将结合实例来介绍如何使用它来进行 J2SE 的开发。 MVC 是一个非常常见的设计模式,被...

鉴客
2011/01/08
2.3K
1
puremvc c++ simple demo

(1)puremvc 流程简述: core: model,view,control patterns:Mediator,Proxy,Observer,Facade,Command 核心和模型的纽带:Mediator (2)使用一个简单的登陆窗口模拟puremvc的使用(vs200...

YKIT
2014/02/09
695
0
20 个值得一试的JavaScript 框架

本文介绍20个值得一试的JavaScript框架,如果你认为答案是jQuery,那你只能得F级的评级。 闲话少说,看看便知,列表如下: Sproutcore Sproutcore 提供大量的高性能应用包括MobileMe等。Spr...

小卒过河
2011/09/26
3.6K
9
c++中如何使用puremvc

如何在c++中使用puremvc开发程序,能否给个详细的实例,非常感谢!

oschina_lhch
2014/12/15
188
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
9
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部