浅谈使用NGUI的界面架构(二)关于NData

作者:kUANG tOBY
链接:https://zhuanlan.zhihu.com/p/21306120
来源:知乎

  在刚接触NGUI的时候,我们一般会采用在脚本中获取NGUI 组件的形式给NGUI 组件赋值。有两种选择:一种是在代码中根据路径获取NGUI 组件;另一种是在场景中,直接把组件拖到脚本上。第一种方法的的缺点是需要维护NGUI组件的路径,第二种方法的缺点是替换组件时总是需要重新拖组件。两种方法都比较不方便,这里用第二种来举例。

  打个比方,我们界面右上角要显示玩家拥有的金币总数。于是我们做了个UILabel拖进脚本,在脚本里给它的text赋值显示当前金币数量。

  PagePlayer.cs中:

  1. public UILabel goldLabel;
  2. public void SetGold( string gold )
  3. {
  4. goldLabel.text = gold;
  5. }

复制代码

  后来策划需求在左下角和右下角也要显示金币,于是我们又做了两个uilabel放到相应位置,并在脚本里添加变量,把新加的uilabel拖到脚本里。每次金币的值发生变化,就要找到所有的uilabel变量给他们一一赋值。

  PagePlayer.cs中:

  1. public UILabel goldLabel;
  2. public UILabel goldLabel1;
  3. public UILabel goldLabel2;
  4. public void SetGold( string gold )
  5. {
  6. goldLabel.text = gold;
  7. goldLabel1.text = gold;
  8. goldLabel2.text = gold;
  9. }
  10. 作者:kUANG tOBY
  11. 链接:https://zhuanlan.zhihu.com/p/21306120
  12. 来源:知乎
  13. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复制代码

  然而可能以后又会增加其它显示金币的界面,每加一个金币的UILabel,就要去脚本里增加一个UILabel 的变量然后在金币变化的时候给它赋值。虽然麻烦,但也能把功能做出来。我们不能就此满足,偷懒是提高生产力的最大动力。

  现在想要简化这个流程,就要实现以下功能。

  1,不需要每次添加金币文字的时候都在脚本中新增一个UILabel变量,并把对应的UILabel组件拖进来。

  2,不需要每次修改金币的时候都要找到所有的金币UILabel变量去修改他们的值。

  初步的解决方案是这样子的:我希望脚本里面有一个值 gold代表的是金币数量。所有的金币UILabel 都跟这个值产生关联。只要修改这个值,所有跟他关联的UILabel 都自动发生变化。另外,在我要添加一个金币UILabel 的时候,我希望它能自动去找页面脚本中的gold变量来发生关联,而不需要我在脚本中改代码。

  具体实现的思路,就是在带有UILabel脚本的物体上加一个脚本,使其与页面脚本种的gold变量发生关联。然后给gold变量加set方法,在这个方法中发一个消息,告知所有和gold有过关联的的UILabel要发生值的改变。这样每次给gold变量赋值的时候,所有与其关联的UILabel就会自动更新显示的内容。

  本着不重复造轮子的原则,在疑似开始造轮子之前一定要Google一下。于是在网上搜出了MVVM模式,NData插件等等。并发现NData不仅可以用于UILabel,还可以用于各种NGUI组件,并有很好的绑定层级管理。

  NData就是基于MVVM模式,其中用户自定义继承EZData.Context的类,就相当于是自定义ViewModel层的内容。

  剩下的问题就是,怎样用这个工具来管理页面。

  根据上文,我把界面分成很多个TweenPage,然后在单例MainPageMgr中统一管理。对于数据,我希望把每个页面的数据也独立出来,即每个页面有一个对应的继承EZData.Context的类,这个页面相关的数据都放在这个类中,然后再由MainPageMgr来统一管理。

  例如有个游戏页面PageInGame,用来显示游戏中获得的金币,钻石和星星。现在新建一个PageInGameContext继承EZData.Context。现在PageInGame页面就有一个model层PageInGame类和一个ViewModel层PageInGameContext类。View层自然就是PageInGame物体下面的NGUI组件了。这样就形成了MVVM模式。

  1. using UnityEngine;
  2. using System.Collections;
  3. public class PageInGameContext : EZData.Context
  4. {
  5. #region Property Gold
  6. private readonly EZData.Property<int> _privateGoldProperty = new EZData.Property<int> ();
  7. public EZData.Property<int> GoldProperty { get { return _privateGoldProperty; } }
  8. public int Gold {
  9. get    { return GoldProperty.GetValue (); }
  10. set    { GoldProperty.SetValue (value); }
  11. }
  12. #endregion
  13. #region Property Diamond
  14. private readonly EZData.Property<int> _privateDiamondProperty = new EZData.Property<int> ();
  15. public EZData.Property<int> DiamondProperty { get { return _privateDiamondProperty; } }
  16. public int Diamond {
  17. get    { return DiamondProperty.GetValue (); }
  18. set    { DiamondProperty.SetValue (value); }
  19. }
  20. #endregion
  21. #region Property Star
  22. private readonly EZData.Property<int> _privateStarProperty = new EZData.Property<int> ();
  23. public EZData.Property<int> StarProperty { get { return _privateStarProperty; } }
  24. public int Star {
  25. get    { return StarProperty.GetValue (); }
  26. set    { StarProperty.SetValue (value); }
  27. }
  28. #endregion
  29. }
  30. public class PageInGame : TweenPage {
  31. public PageInGameContext Context;
  32. protected override void Awake ()
  33. {
  34. base.Awake ();
  35. MainPageMgr.instance.Context.pageInGame = this;
  36. Context = MainPageMgr.instance.Context.pageInGameCtx;
  37. }
  38. protected override void OnPreBringIn ()
  39. {
  40. base.OnPreBringIn ();
  41. }
  42. protected override void OnPreBringOut ()
  43. {
  44. base.OnPreBringOut ();
  45. }
  46. }

复制代码

  在MainPageMgr中有一个MainView Context是用来管理所有页面的Context(下文中继承EZData.Context的类,都统称为Context。):

  1. public class MainPageMgr : PageMgrSingleton<MainPageMgr>
  2. {
  3. public NguiRootContext View;
  4. //这个代表页面模型
  5. public MainView Context;
  6. void Awake()
  7. {
  8. Context = new MainView();
  9. SetContext();
  10. }
  11. public void SetContext()
  12. {
  13. View.SetContext(Context);
  14. }
  15. }

复制代码

  MainView.cs

  这样,所有的页面都可以通过MainPageMgr.instance.Context来获取所有页面的Context,如pageXXXContext,也可以获得所有页面的逻辑脚本,如pagXXX。

  在场景里,只需要把页面放在MainPageMgr的下级,然后再通过Master path来绑定到MainPageMgr中的Context就可以了。

  在开发中,可能出现不同的页面共用相同的数据,这种情况就可以直接把两个页面的Master Path绑定到同一个Context上,这样开发起来会方便很多。

   总结:

  引入NData这个插件,主要是为了减少一些对NGUI组件的操作(如获取组件和赋值等),把所有的工作都简化为改变Context中的值,来动态改变NGUI组件的显示。把各个页面的Context都统一管理,是为了更方便地获取数据,但原则上不应该在A页面的model层中去修改B页面Context中的数据,因为这样容易造成混乱。

  使用NData加NGUI,可以很快速地搭建一套页面框架。现在我已经把这两个工具专门打成插件包,开发新项目时直接导进去用,非常方便。

浅谈使用NGUI的界面架构(二)关于NData 作者:kUANG tOBY相关推荐

  1. 浅谈棋牌游戏开发框架之架构

    浅谈棋牌游戏开发框架之架构 关键字: 棋牌游戏 架构 框架 开发 发表文章 摘要:现在来和大家分享下怎么架构和实现框架来满足棋牌游戏需求的.一.原型符合棋牌项目框架,快速换皮,快速融合.多渠道多包体. ...

  2. 浅谈政务行业售前架构(解决方案)岗位应知应会

    如果这是一个命题<浅谈政务行业售前架构岗位应知应会>,那么我下面会从工作实际情况进行阐述: 一.但凡谈到政务行业,一定少不了公检法司.教育.文旅.发改工信科技委员会等等政务机构,今天只谈谈 ...

  3. 浅谈纯远程配置树莓派(二)

    浅谈纯远程配置树莓派(二) --简单配置.通过SSH访问及配置向导介绍 前情提要:上篇(链接:http://blog.csdn.net/octsjimmy/article/details/700455 ...

  4. 浅谈ASP.NET的内部机制(二)

    浅谈ASP.NET的内部机制(二)         前言:大家知不知道,一个Http Request是如何被传递给ASP.NET的?而且ASP.NET是如何知道一个 Http Request是请求的. ...

  5. 浅谈Linux PCI设备驱动(二)

    我们在浅谈Linux PCI设备驱动(一)中(以下简称浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设备驱 ...

  6. 浅谈小程序开源业务架构建设之路

    导读:本文首先引入百度小程序开源生态介绍,随后在发展道路中遇到厂商浏览器合作场景,引出小程序分发保障的痛点和挑战,接着分别从分发通路.能力检测.能力匹配以及能力干预方面详细探讨了具体的方案和设计,最后 ...

  7. 老杨说运维 | 2023,浅谈智能运维趋势(二)

    (文末附视频,一键观看精彩内容) 前言: 上文提到了智能运维现状中的变化趋势以及 上文提到了智能运维现状中的变化趋势以及过往误区,老杨认为智能运维的体系化建设还需从抓牢数据治理为起点,以终为始做好规划 ...

  8. 浅谈电子配线架智能布线管理系统(二)

    中程科技有限公司 洪宇伟 二.电子配线架智能布线系统的优势 1.实时监测端到端网络连接      电子配线架智能布线系统采用ANSI/TIA/EIA 568-B<商业建筑通信布线标准>推荐 ...

  9. 浅谈用户体验与界面设计

    用户体验是个涉及面很宽泛的问题--重视用户体验的站点设计者们,努力地不断试用着自己的和他人的作品,不断地琢磨并优化着各种操作细节,找出能找到的最好的设计--可以说,实操中的用户体验建设,更多是一种&q ...

最新文章

  1. Nagios监控之9:利用sendmail使用第三方SMTP服务发送邮件报警
  2. 在wildfly 21中搭建cluster集群
  3. Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
  4. 我需要别人承认才快乐吗?
  5. python中order函数_order by排序
  6. linux常用命令(4)——系统管理2
  7. Excel 如何让复制的内容保持原文本格式
  8. 【解释】对用户透明=对用户隐蔽:关系模型的存取路径对用户透明
  9. 枪火游侠服务器停机维护,腾讯《枪火游侠》公布国服停运公告 11月30日正式关服...
  10. 计算机键盘时好时坏,电脑鼠标时好时坏的解决方法
  11. uni-app 保存图片到本地相册
  12. JavaScript异形滚动轮播
  13. 利用JavaScript实现一个简单的猜数字游戏
  14. 计算机视觉(CV)方向今年招聘情况怎么样?是否已经人才过剩?
  15. 河南朱砂服务器位置,探访河南境内规模最大的龙山遗址 龙山大墓主人头部疑似涂有朱砂...
  16. 老油条用什么工具写文档?
  17. 映美Jolimark 24针打印机驱动
  18. 怎么用软件测试内存条是否好坏,内存如何检测?Win7检测内存条好坏的方法
  19. 2020年12月CFA一二三级考试重要时间点公布!
  20. 17.7.29 随笔

热门文章

  1. 2022 年 360反馈的好处(所有企业规模)
  2. 查看功能所放职责菜单
  3. android顶替toast,android – 使用Toast的替代方案
  4. 7.DOM(六)①创建create#插入appendChild(子元素)#替换insert,replace#删除DOM对象节点②复制节点.深复制,浅复制cloneNode⑥取消超链接a默认跳转行为
  5. 数字IC设计工具教程——VCS常用命令
  6. SVM(support vector machine)算法详解中之转化对偶问题
  7. 数学分析笔记8:广义积分
  8. 赛尔号服务器维护多长时间,赛尔号这个游戏还能坚持多久?
  9. 将随机森林应用到医学中 预后
  10. 做短视频时自己的声音不好听,有没有让声音好听的办法?