网站公告 | 泰课在线2017年双十一活动11.7~11.17全站6.8折,三大活动点击查看
查看: 438|回复: 10
收起左侧

[Unity框架]PureMVC在unity中的简单使用

[复制链接]

[Unity框架]PureMVC在unity中的简单使用[复制链接]

梦幻星移 发表于 2017-9-1 07:14:32 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式 回复:  10 浏览:  438
  效果图:

[Unity框架]PureMVC在unity中的简单使用

[Unity框架]PureMVC在unity中的简单使用


  如上图所示,是一个十分简单的东西,但这次我们要结合PureMVC去实现它。

  1.首先,我们知道要使用PureMVC,最主要就是去实现Facade、Proxy、Mediator、SimpleCommand(或MacroCommand)的子类,而这些子类显然是不能挂在物体上的。因为子类没有继承MonoBehaviour,所以常用的Find、GetComponent我们是用不到的,这时候我们就可以把MonoBehaviour的一部分功能封装到一个类里,由这些子类去调用,这样就可以解决问题了。

[C#] 纯文本查看 复制代码
using UnityEngine;  
using System.Collections;

  
public>
  /// <summary>
  /// 获取子节点
  /// </summary>
  public static Transform GetChild(GameObject root, string path)
  {
  Transform tra = root.transform.Find(path);
  if (tra == null) Debug.Log(path + "not find");
  return tra;
  }

  /// <summary>
  /// 获取子节点组件
  /// </summary>
  public static T GetChildComponent<T>(GameObject root, string path) where T : Component
  {
  Transform tra = root.transform.Find(path);
  if (tra == null) Debug.Log(path + "not find");
  T t = tra.GetComponent<T>();
  return t;
  }
  
}


  
2.同时我们也知道PureMVC的通信是通过Notification和观察者模式去实现的,Notification通常用字符串常量去表示,为了方便管理,应该把这些常量放到一个类中。
[C#] 纯文本查看 复制代码
using UnityEngine;  
using System.Collections;

  
public>
  public const string LevelUp = "LevelUp";
  public const string LevelChange = "LevelChange";
  
}



3.接下来我们对数据进行定义。TestProxy会在数据发生变化时发送通知,进而更新view组件。
[C#] 纯文本查看 复制代码
using UnityEngine;  
using System.Collections;

  
public>
  public int Level { get; set; }
  public int Hp { get; set; }

  public CharacterInfo()
  {

  }

  public CharacterInfo(int level, int hp)
  {
  Level = level;
  Hp = hp;
  }
  
}


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

  
public>
  public new const string NAME = "TestProxy";
  public CharacterInfo Data { get; set; }

  public TestProxy() : base(NAME)
  {
  Data = new CharacterInfo();
  }

  public void ChangeLevel(int change)
  {
  Data.Level += change;
  SendNotification(NotificationConstant.LevelChange, Data);
  }
  
}


  
4.再接下来我们来实现Mediator的子类,当点击按钮时发送通知。
[C#] 纯文本查看 复制代码
using UnityEngine;  
using System.Collections;
  
using System.Collections.Generic;
  
using PureMVC.Patterns;
  
using UnityEngine.UI;

  
public>
  public new const string NAME = "TestMediator";

  private Text levelText;
  private Button levelUpButton;

  public TestMediator(GameObject root) : base(NAME)
  {
  levelText = GameUtility.GetChildComponent<Text>(root, "Text/LevelText");
  levelUpButton = GameUtility.GetChildComponent<Button>(root, "LevelUpButton");

  levelUpButton.onClick.AddListener(OnClickLevelUpButton);
  }

  private void>  {
  SendNotification(NotificationConstant.LevelUp);
  }

  public override IList<string> ListNotificationInterests()
  {
  IList<string> list = new List<string>();
  list.Add(NotificationConstant.LevelChange);
  return list;
  }

  public override void HandleNotification(PureMVC.Interfaces.INotification notification)
  {
  switch (notification.Name)
  {
  case NotificationConstant.LevelChange :
  CharacterInfo ci = notification.Body as CharacterInfo;
  levelText.text = ci.Level.ToString();
  break;
  default :
  break;
  }
  }
  
}

  
5.接着就是对业务逻辑的处理。
[C#] 纯文本查看 复制代码
using UnityEngine;  
using System.Collections;
  
using PureMVC.Patterns;

  
public>
  public new const string NAME = "TestCommand";

  public override void Execute(PureMVC.Interfaces.INotification notification)
  {
  TestProxy proxy = (TestProxy)Facade.RetrieveProxy(TestProxy.NAME);
  proxy.ChangeLevel(1);
  }
  
}


  
6.最后把上面的几个类进行注册,注册的内部包含了对通知的订阅。
[C#] 纯文本查看 复制代码
using UnityEngine;  
using System.Collections;
  
using PureMVC.Patterns;

  
public>
  public TestFacade(GameObject canvas)
  {
  RegisterCommand(NotificationConstant.LevelUp, typeof(TestCommand));
  RegisterMediator(new TestMediator(canvas));
  RegisterProxy(new TestProxy());
  }

  7.最后的最后,对TestFacade进行初始化,并把脚本挂在Canvas上就可以了(其实挂在哪个物体都行,只要ui控件能find就可以了)

using UnityEngine;  
using System.Collections;

  
public>
  void Start () 
  {
  new TestFacade(gameObject);
  }
  
}



  分析:
  当点击按钮时,会发送LevelUp的消息,然后TestCommand就会处理这个消息,让等级加一;因为等级的数据发生了变化,所以TestProxy(这个类是对数据的进一步封装)会发送LevelChange的消息,然后TestMediator就会处理这个消息,让UI发生变化。可以看到,TestCommand负责逻辑,TestProxy负责数据,TestMediator负责界面,而TestFacade就是这三个类的总管,结构就很清晰了。

  总结:
  可以看到,其实对于这样的功能,可以用几行代码就可以实现了,但用PureMVC去实现,却复杂了不少。但是如果要搞一个大工程,MVC的强大就体现出来了。MVC这样的思想应用到unity中应该是不错的,至于要不要使用MVC框架,就见仁见智了,因为有些人不使用PureMVC也可以搞得很好,而有些人使用PureMVC也可以搞得很好。。。


来源:http://blog.csdn.net/lyh916/article/details/50076463
+1
440°C
10
  • 2262006647
  • 2262006647
  • 猛子
  • 我了个去
  • maxcs2012
过: 他们
因分享而快乐,学习以自强!
2262006647 发表于 2017-9-4 11:08:56 显示全部楼层
#在这里快速回复#4525
因分享而快乐,学习以自强!
2262006647 发表于 2017-9-4 14:20:11 显示全部楼层
#在这里快速回复#          15# zoeyun520 发表于 2016-1-5 00:38:45 只看该作者 顶起来,好源码要支持 因分享而快乐,学习以自强!
因分享而快乐,学习以自强!
猛子 发表于 2017-9-5 04:44:35 显示全部楼层
我大unity666
因分享而快乐,学习以自强!
我了个去 发表于 2017-9-5 19:08:59 显示全部楼层
来untiy版看看
因分享而快乐,学习以自强!
maxcs2012 发表于 2017-9-6 09:33:23 显示全部楼层
u3d新人路过
因分享而快乐,学习以自强!
acepig 发表于 2017-9-6 23:57:47 显示全部楼层
让我看一看啊
因分享而快乐,学习以自强!
天空的心 发表于 2017-9-7 16:55:43 显示全部楼层
来untiy版看看
因分享而快乐,学习以自强!
我了个去 发表于 2017-9-8 09:53:38 显示全部楼层
会是几楼呢?
因分享而快乐,学习以自强!
feelbug 发表于 2017-9-9 01:19:30 显示全部楼层
遛一圈,点个赞
因分享而快乐,学习以自强!
只爱脆夹心 发表于 2017-9-9 16:45:22 显示全部楼层
谢谢 楼主 疯ixang
因分享而快乐,学习以自强!

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 沪ICP备14023207号-9 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.2

1
QQ