Unity之NGUI常见问题汇总

发表于2016-10-20
评论1 2.9k浏览
  主要总结一下新手在使用NGUI时常见的问题。如有不明之处或是有更好的解决方法可以留言。希望大家可以把自己工作中遇见的问题分享出来,让我们共同进步!谢谢!

一、UIToggle
1、如何判断Toggle是否勾选状态。
  可以直接通过btn.GetComponent().value; 来判断是否勾选状态。
2、代码控制改变Toggle状态。
  btn.GetComponent().value = true / false; 如果不行时,启个协程下一帧去执行或者看看是不是第三条原因导致的。
3、如何在切页或更新时将Toggle隐藏不显示。
编辑器的步骤:
  首先是创建Sprite(暂且将它成为Object),然后添加Button,Box Collider,Toggle。
  此时要注意的是:Sprite的Atlas为空,Toggle的Starting State不勾选,Box Collider根据需要调整大小。
  然后在创建的Object下面创建一个新的Sprite(暂且将它成为Icon)子物体放上需要的图片,将子物体拖到Toggle的State Transition 下的Sprite上。
代码步骤:
  在切页或更新时需要将数据从新赋值,这个时候将所有Object下面的Icon设为false;然后再次点击时将Icon设法true就OK啦。
需要注意的是:
  如果Object上没有Sprite的话,将Icon设为false后会导致点击没有任何反应。
  如果Object上没有Toggle的话,也没有修改代码,点击是会导致上次点击的Icon还是处于显示状态,没有实现切换功能。(但此处也可以修改代码来解决)

二、UILabel
1、读取数据库或代码输入一段字符串中使用“n”等换行符号无效。
  先让我吐槽10块钱的。刚接手一个项目,发现之前的同事的解决方法是每一行都实例化一个UILabel。我也是醉醉的。
  解决方法是:ToString().Replace("#","n");  #表示需要换行的标识符。
2、为何Overflow选项只能选择Shrink Content和Clamp Content?
  因为设置Anchors的Type了。将Type改为None就可以了。
3、如何实现文字从上至下显示?
  修改Widget中的Size大小。

三、UIButton
1、代码动态加UIbutton为什么点不了?
  检查一下该Object上是否有Collider或Collider是否启用,还有Collider的Size。如果Collider也是动态加载的,请参考Collider问题。
2、为什么代码添加UIbutton但Sprite还是灰色,但鼠标移动上去颜色就变正常了。
  调整一下动态加载UIButton和Collider的循序。
3、Button上面放置一个Label,为什么点不到Button。
  因为Label上面也有一个Collider。如果点击不到Button查一查有没有别的Collider在Button上面。
  想知道鼠标事件被什么阻挡可以在UIRoot下的Camera ->定位到UI Camera组件 -> 勾选Debug。运行点击即可。

四、Collider
1、怎么修改不了Collider的大小?
  检查Sprite或UILabel上的Collider是否勾选了。如果勾选了,运行游戏后就会自适应大小。

2、动态加载Collider时,提前代码中也将Sprite或UILabel的autoResizeBoxCollider设为true了为什么Collider还不能自适应Size,如何设置?
  最简单的方式就是:GNUITools.UpdateWidgetCollider(Object,true); 第一个参数是一个游戏对象,第二个参数是是否自动适应。这个函数会自动为Object添加一个            Collider,为什么不用提前添加一个Collider。 可以进这个函数中看一看。

五、ScrollView
1、为什么运行时实例化的物体位置有时会出现偏移不对?
  检查一下实例化物体的Collider的大小。
2、如何实现鼠标下拉或上拽到一定位置后松开进行刷新?
  可以通过ScrollView中的onDragFinished配合isDragging进行操作。
  大概实现方法是:
  设一个全局变量bool(m_IsCan);
  写一个函数,判断是否isDragging,如果是,获取ScrollBar的value,然后判断ScrollView的LocalPosition.Y位置并且判断ScrollBar是否小于0.05f或0.98f;如果是,            将m_IsCan设为true,否则,设为false; 将这个函数放在Update里面去判断。
  再写一个翻页的函数。当触发onDragFinished时调用。

六、设置控件对齐
1、选中某个控件 -> Anchors -> Type 选中为Unified -> 选择要对齐到哪个对象 ->设置对齐。
  Unified:可以指定另外一个对象,以这个对象来对准。分为left,right,top,bottom。 可以四个选项都选择一个基准点。
  Advanced:可以分别为Left,Right,Top,Bottom指定一个对象来对齐,也可以指定四个。
2、UILabel 输入Text时,如何使文字从左或右保持不动。
  设置widget下面的Pivot。

七、Tween
1、如何让一个控件逐渐变大变小?
  可以使用Tween Height和TweenWidth。
2、如何移动一个控件从一点到另一点。
  可以使用Tween Position。
  想要的淡进淡出等之类的效果,可以好好看一下Tween。
  Tween的设置:
  From:开始状态;
  To:结束状态;
  Animation Curve:动画曲线,用来微调这两个值的变化过程;
  Play Style:播放方式;(ping pong也表示循环播放,不过会播放完会回退这个过程再播放)
  Duration:开始状态变换到结束状态的时间,即一次动画的时长;
  Start Delay:进行延迟播放;
  Tween Group:可以控制在同一个object上的多个tween触发哪个,播放时指定group ID。

八、序列帧
1、可以使用Sprite Animation来实现。
  Framerate :控制速度
  Name Prefix:需要播放的序列帧Icon名字
  Loop:是否循环
  Pixel Snap:勾选时是按图片的原大小播放,不勾选时,则按第一个Icon的大小进行播放。
2、还有一种是Frame Animation。
  Count :图片数量
  FPS:刷新率
  Name:Icon的名字
  Is Loop: 是否循环
  Auto Start:自动开始
  我个人比较推荐使用第一种方法实现。

九、UISprite
1、如何使用代码动态改变UI Sprite的Atlas和Sprite?
  UISprite m_Icon = null;
  m_Icon.atlas = "AtlasName";
  m_Icon.spriteName = "IconName";
2、图片如何切九宫。
  选择Atlas -> Sprite Details -> Border 输入要切的四个方向。然后返回UISprite 选择Type -> Sliced。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论