NGUI中项目的一些设置,要使用NGUI开发,1:导入ngui插件包(Assets ---importpackege ---custompackege---选择本地已经下好的包),
2导入vs2013(或者其他版本的vs)的工具(Assets----importpackege ----vs2013 tool)
1步后可以用ngui开发,2步后,可以是使用vs直接编辑脚本,
控件显示优先级 -- depth:在2d场景下拖拽编辑的时候,由于这个视图的z轴是大家都一样的,相对于摄像机来说,决定那个控件在上面,取决于depht(深度),这个指,也就是优先级,这个值越大,优先级越高,depht 为2 和depth 为1的两个按钮重叠在一起,depth为2的控件显示在上面
内建布局系统:如果控件之间建立了父子系统,如果拖拽父控件的大小,那么子控件会相应的调整大小,以符合跟父控件保持一个先对成比例的大小,比如说,父控件大小为6*5 ,子控件大小为3*4,如果父控件改成12*5,那么子控件相应调整为6*5 (大约是缩放属性变化)
控件关联anchor(译为:锚):两个控件之间不是父子关系,也可以做一些联系,个人认为锚的意思是:锚的出现是的船能够停泊,船依赖于锚,所以锚也是一种关系,依赖关系,跟父子关系不同,锚关系是相对位置一样,(船和锚的关系就是如此),所以如果一个控件A的锚这个属性选择了B,那么A随着B的移动而移动(大体是平移属性变化)
ps:当anchor属性的目标是UIROOT 的时候,当前控件可以实现停靠在左上角,右上角等实用功能
控件交互:直接新建一个sprite是不能响应的,要是此控件有响应,要有:1.碰撞体,2,处理脚本,
消息的分发由camera的脚本执行,个人认为这是由于一个场景中至少要有摄像机,这个原因的关系,camera是必须的,所以就由他完成这个任务,NGUI中摄像机会把消息分发到处于摄像机视野内的每一个控件
一个控件如果要实现交互功能:1:给控件右键,附加(attach)碰撞器. 这个时候,此控件已经能够接受事件了,接下来就是对事件的响应 2:给该控件添加一个控制脚本(script),NGUI,的一个突出的特点是,已经写好了很多非常优秀脚本,我们可以直接操作脚本开放出来的公有变量:
比如说颜色,有四个,1.普通状态, 2.聚焦状态, 3.按下状态, 4.消失状态, 只要设好这四个变量,那么运行的时候,会在这四种情况下显示设置好的颜色
于此种情况一样的四种贴图,1.普通状态, 2.聚焦状态, 3.按下状态, 4.消失状态, 只要设好这四个变量,那么运行的时候,会在这四种情况下显示设置好的四张贴图
如果是一个按钮由一个精灵(sprite) + 一个标签(label)组成,两个元素都要聚焦或者按下的时候变色,这个时候,如果使用的方式如下: 两个控件分别添加box collider(碰撞器),分别设置四个状态的颜色或者贴图,结果是失败的!!因为,上面说道是由camera分派事件的,其实是摄像机通过射线的检测,后分发的,所有重叠的控件只有距离摄像机近的那个才会有响应,这就是上面所说的优先级:depth,重叠的时候,depth值大的,才会接受到消息,
所以这种措施达不到,背景和标签一起变色,解决方法:既然是一起变色,那么可以不让label响应了,直接就在sprite上面加多一个script,(UIButton),把label的一起改掉
UIButton 浅谈
可以看出,UIButton 开放了以上这些变量给用户使用,可以说已经非常的齐全,四个状态的颜色,四个状态的精灵图片,为了一探究竟,我去打开了源码,我在UIButton这个类里面并没有看到这些变量(毫无疑问,public类型),于是,很自然的往基类走,UIButton的最近的父类是,UIButtonColor(ps:对于这个类名个人觉得并不高明,我猜想,一开始他们的UIButton类就是UIButtonColor,后来更新版本的时候直接加后缀)
于是,我看到了
其实,这四个便操纵颜色的变量并不是真正的Color类型,只是一个颜色状态,整形变量,后面根据这个变量来绘制相应的颜色或者贴图
于是,在UIButton这个类中,我看到了
看来在UIButton中是设置精灵贴图,设置颜色估计在更加底层的基类中,毕竟贴图的比颜色更加高级,更加复杂,贴图的出现肯定是更晚出现的,好吧,往上面再找找看
在UIButtonColor中有,
还真不愧指这个名字,真是这里设置颜色
UIButton中一个很屌的功能:如果点击后要触发某一功能函数,那么将目标game object拖拽到”Notify“属性里,之后在下拉列表中选择相应的的函数。函数的定义一定定义成”public void FuncName (void)“的形式
控件交互高级:由于进度条可以手动操纵,但是有些情况下不允许操作,比如说加载画面,这是一个信息的显示,不应该被操纵,所以,这时消息不应该被捕获,可以新建一个panel,把进度条作为其自对象,当然了,panel的depth比自对象大
在对场景添加物体控件的时候尽量使用右键添加,这样不易出错,少用 inspector 里面的搜索添加,因为比较容易出错,往往达不到效果,在控件上面添加属性或者script的时候尽量都是用右键
控件之间的信息传递,根据以前的经验,控件之间传递信息(比如说有一个编辑框,一个文本框,编辑框内输入一行字,回车,或则点击确定后在文本框上面显示刚刚输入的文本),一般是这样做在按下确定按钮之后,在这个事件处理函数中一般会这样写:分别获取两个控件(编辑框,文本框的引用(或者指针)),然后把编辑框的文本数据get出来,放到一个变量里面,然后再把这个变量set到文本框里面去
其实在unity3d中(NGUI)中也是这样,但是有某些步骤杯简化了(可能是图形界面带来简便,直接通过拖拽就可以实现引用的获取)这些步骤并没有在代码中体现出来,可能会令人迷惑,unity往往是这样做,以体现简易性,我们要习惯这种做法
NGUI中是这样获取字符串的:NGUIText.StripSymbols(myInput.value);这是一个静态函数,把文本转成字符串,去掉颜色什么的,而myinput是一个控件,输入空间他的属性value就是string类型
数据绑定,NGUI中有个数据(属性)绑定的功能 property binding,有两个参数,源数据和目标数据,分别可以进行拖拽,指定然后选择相应的get方法指定特定属性(比如说text ,width)注意,两个数据的类型一定要相同,才能版定,有时候,数据类型不同,会进行转换,比如说 position --->text,会以文本的方式表示出position的值
NGUI中,UIPopupList.current.value ,这一行代码表示,被选中的弹出列表的值(string类型),UIPopupList是一个类,也就是弹出列表类,current是个UIPopupList类型的变量,静态的,也只有是静态的才能够这么调用,(如果是静态方法,就似乎current()),value是current的属性,由此可以知道弹出列表每一项都是一个UIPopupList类型的变量,因为current表示的就是被选中的那一个,其他的没被选中的是同一种类型,然后他如果被选中了,他就被current所引用
NGUI中,atlas贴图的渲染方式有很多种:simple ,slice, filled,tiled,Advanded,其中如果是简单铺放的话,选择sample,tiled是填充,这里重点提一下slice(切片),这是把贴图用四根线把贴图切成九块,在通过拉伸等适应方式做出很不错的效果,
比如说:这是贴图
那么如果是简单的贴图的话,出来的结果是这样的
但是如果用(切片)九宫格的话,九宫格是这样切的