浅谈使用NGUI的界面架构(二)关于NData 作者:kUANG tOBY
浅谈使用NGUI的界面架构(二)关于NData
在刚接触NGUI的时候,我们一般会采用在脚本中获取NGUI 组件的形式给NGUI 组件赋值。有两种选择:一种是在代码中根据路径获取NGUI 组件;另一种是在场景中,直接把组件拖到脚本上。第一种方法的的缺点是需要维护NGUI组件的路径,第二种方法的缺点是替换组件时总是需要重新拖组件。两种方法都比较不方便,这里用第二种来举例。
打个比方,我们界面右上角要显示玩家拥有的金币总数。于是我们做了个UILabel拖进脚本,在脚本里给它的text赋值显示当前金币数量。
PagePlayer.cs中:
- public UILabel goldLabel;
- public void SetGold( string gold )
- {
- goldLabel.text = gold;
- }
复制代码
后来策划需求在左下角和右下角也要显示金币,于是我们又做了两个uilabel放到相应位置,并在脚本里添加变量,把新加的uilabel拖到脚本里。每次金币的值发生变化,就要找到所有的uilabel变量给他们一一赋值。
PagePlayer.cs中:
- public UILabel goldLabel;
- public UILabel goldLabel1;
- public UILabel goldLabel2;
- public void SetGold( string gold )
- {
- goldLabel.text = gold;
- goldLabel1.text = gold;
- goldLabel2.text = gold;
- }
- 作者:kUANG tOBY
- 链接:https://zhuanlan.zhihu.com/p/21306120
- 来源:知乎
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码
然而可能以后又会增加其它显示金币的界面,每加一个金币的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模式。
- using UnityEngine;
- using System.Collections;
- public class PageInGameContext : EZData.Context
- {
- #region Property Gold
- private readonly EZData.Property<int> _privateGoldProperty = new EZData.Property<int> ();
- public EZData.Property<int> GoldProperty { get { return _privateGoldProperty; } }
- public int Gold {
- get { return GoldProperty.GetValue (); }
- set { GoldProperty.SetValue (value); }
- }
- #endregion
- #region Property Diamond
- private readonly EZData.Property<int> _privateDiamondProperty = new EZData.Property<int> ();
- public EZData.Property<int> DiamondProperty { get { return _privateDiamondProperty; } }
- public int Diamond {
- get { return DiamondProperty.GetValue (); }
- set { DiamondProperty.SetValue (value); }
- }
- #endregion
- #region Property Star
- private readonly EZData.Property<int> _privateStarProperty = new EZData.Property<int> ();
- public EZData.Property<int> StarProperty { get { return _privateStarProperty; } }
- public int Star {
- get { return StarProperty.GetValue (); }
- set { StarProperty.SetValue (value); }
- }
- #endregion
- }
- public class PageInGame : TweenPage {
- public PageInGameContext Context;
- protected override void Awake ()
- {
- base.Awake ();
- MainPageMgr.instance.Context.pageInGame = this;
- Context = MainPageMgr.instance.Context.pageInGameCtx;
- }
- protected override void OnPreBringIn ()
- {
- base.OnPreBringIn ();
- }
- protected override void OnPreBringOut ()
- {
- base.OnPreBringOut ();
- }
- }
复制代码
在MainPageMgr中有一个MainView Context是用来管理所有页面的Context(下文中继承EZData.Context的类,都统称为Context。):
- public class MainPageMgr : PageMgrSingleton<MainPageMgr>
- {
- public NguiRootContext View;
- //这个代表页面模型
- public MainView Context;
- void Awake()
- {
- Context = new MainView();
- SetContext();
- }
- public void SetContext()
- {
- View.SetContext(Context);
- }
- }
复制代码
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相关推荐
- 浅谈棋牌游戏开发框架之架构
浅谈棋牌游戏开发框架之架构 关键字: 棋牌游戏 架构 框架 开发 发表文章 摘要:现在来和大家分享下怎么架构和实现框架来满足棋牌游戏需求的.一.原型符合棋牌项目框架,快速换皮,快速融合.多渠道多包体. ...
- 浅谈政务行业售前架构(解决方案)岗位应知应会
如果这是一个命题<浅谈政务行业售前架构岗位应知应会>,那么我下面会从工作实际情况进行阐述: 一.但凡谈到政务行业,一定少不了公检法司.教育.文旅.发改工信科技委员会等等政务机构,今天只谈谈 ...
- 浅谈纯远程配置树莓派(二)
浅谈纯远程配置树莓派(二) --简单配置.通过SSH访问及配置向导介绍 前情提要:上篇(链接:http://blog.csdn.net/octsjimmy/article/details/700455 ...
- 浅谈ASP.NET的内部机制(二)
浅谈ASP.NET的内部机制(二) 前言:大家知不知道,一个Http Request是如何被传递给ASP.NET的?而且ASP.NET是如何知道一个 Http Request是请求的. ...
- 浅谈Linux PCI设备驱动(二)
我们在浅谈Linux PCI设备驱动(一)中(以下简称浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设备驱 ...
- 浅谈小程序开源业务架构建设之路
导读:本文首先引入百度小程序开源生态介绍,随后在发展道路中遇到厂商浏览器合作场景,引出小程序分发保障的痛点和挑战,接着分别从分发通路.能力检测.能力匹配以及能力干预方面详细探讨了具体的方案和设计,最后 ...
- 老杨说运维 | 2023,浅谈智能运维趋势(二)
(文末附视频,一键观看精彩内容) 前言: 上文提到了智能运维现状中的变化趋势以及 上文提到了智能运维现状中的变化趋势以及过往误区,老杨认为智能运维的体系化建设还需从抓牢数据治理为起点,以终为始做好规划 ...
- 浅谈电子配线架智能布线管理系统(二)
中程科技有限公司 洪宇伟 二.电子配线架智能布线系统的优势 1.实时监测端到端网络连接 电子配线架智能布线系统采用ANSI/TIA/EIA 568-B<商业建筑通信布线标准>推荐 ...
- 浅谈用户体验与界面设计
用户体验是个涉及面很宽泛的问题--重视用户体验的站点设计者们,努力地不断试用着自己的和他人的作品,不断地琢磨并优化着各种操作细节,找出能找到的最好的设计--可以说,实操中的用户体验建设,更多是一种&q ...
最新文章
- Nagios监控之9:利用sendmail使用第三方SMTP服务发送邮件报警
- 在wildfly 21中搭建cluster集群
- Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
- 我需要别人承认才快乐吗?
- python中order函数_order by排序
- linux常用命令(4)——系统管理2
- Excel 如何让复制的内容保持原文本格式
- 【解释】对用户透明=对用户隐蔽:关系模型的存取路径对用户透明
- 枪火游侠服务器停机维护,腾讯《枪火游侠》公布国服停运公告 11月30日正式关服...
- 计算机键盘时好时坏,电脑鼠标时好时坏的解决方法
- uni-app 保存图片到本地相册
- JavaScript异形滚动轮播
- 利用JavaScript实现一个简单的猜数字游戏
- 计算机视觉(CV)方向今年招聘情况怎么样?是否已经人才过剩?
- 河南朱砂服务器位置,探访河南境内规模最大的龙山遗址 龙山大墓主人头部疑似涂有朱砂...
- 老油条用什么工具写文档?
- 映美Jolimark 24针打印机驱动
- 怎么用软件测试内存条是否好坏,内存如何检测?Win7检测内存条好坏的方法
- 2020年12月CFA一二三级考试重要时间点公布!
- 17.7.29 随笔
热门文章
- 2022 年 360反馈的好处(所有企业规模)
- 查看功能所放职责菜单
- android顶替toast,android – 使用Toast的替代方案
- 7.DOM(六)①创建create#插入appendChild(子元素)#替换insert,replace#删除DOM对象节点②复制节点.深复制,浅复制cloneNode⑥取消超链接a默认跳转行为
- 数字IC设计工具教程——VCS常用命令
- SVM(support vector machine)算法详解中之转化对偶问题
- 数学分析笔记8:广义积分
- 赛尔号服务器维护多长时间,赛尔号这个游戏还能坚持多久?
- 将随机森林应用到医学中 预后
- 做短视频时自己的声音不好听,有没有让声音好听的办法?