NGUI在Unity中因更改窗口区域而出现Bug的处理
最近,在Unity5.0.1中遇到了NGUI中的一些BUG问题,比如,你用NGUI开发进行拖拽Sprite
的功能,或者在一些Lable上使用了dynamic font, 然后把它编译成可在PC上运行的exe可执行
文件 (记得 Player Settings的Resolution中勾上Resizealbe Window), 当它运行时,这时你就
会发现问题来了,比如打开时是720*480大小的窗口区域,然后你通过拖拽窗口边界,或者直接
进行窗口最大化放大,这时你会发现UI Root中的Sprite仍然只能在720*480的大小区域中拖动,
而dynamic font也会因为放大而失真,如图:
(这里图片缩小了,dynamic font失真的效果可能看不大出来,原来的字体比这里的更清晰,
另外,那张拖拽的Sprite角色图片已经到达边界了,处在720*480右下角位置)
我试了一下,这个问题在4.6.4中也存在,但这绝不是我个人的问题!!为什么这么说呢?因为这个问题即便是
在NGUI的example11示例中也存在!!后来我去Unity官方重新下了个4.5.5的版本,突然奇迹的发现,NGUI这个
问题消失了,所以我推测,自从UGUI出现后,Unity对NGUI的支持就不好了,所以除非你对NGUI了解到了能随意
修改源代码的地步,否则最好不要在4.6.x以上的版本中使用NGUI 。(其实我从使用NGUI到现在只有3天)
(PS: 我用的NGUI是最新的3.8.2版本,3.6.8也试过,情况没有改变)
好了,现在知道BUG出现的原因了,但是我的项目使用的是Unity5.0.1, 而且我已经使用了NGUI才发现了这个BUG
的存在,那么是否有办法在Unity中友好的解决这个问题呢?答案是肯定的。
但我本身对NGUI还不是很了解,而且我看过部分的源代码,发现要去彻底的熟悉并去修改它的底层代码还需要一些
时间,且有一定难度,所以我选择了第二条路,直接从高层修改,将变化响应到NGUI,那么具体该怎么做呢?很简单,
只要把我写的这个C#脚本挂到UI Root 上就行了,下面是脚本的内容:
using UnityEngine; using System.Collections; public class Screen_Adapt : MonoBehaviour { UIPanel panel; Vector2 screen; float alphaDelta = 0.001f; // Use this for initialization void Start () { panel = GetComponent<UIPanel>(); screen = new Vector2(Screen.width, Screen.height); } // Update is called once per frame void Update () { bool scrSizeChanged = screen.x != Screen.width || screen.y != Screen.height; if (scrSizeChanged) { //设置分辨率来通知NGUI更新拖拽区域 Screen.SetResolution(Screen.width, Screen.height, false); screen = new Vector2(Screen.width, Screen.height); /* * 如果设置为同样的值,NGUI会考虑到效率,所以不会重新设置, * 所以用delta来设置看不见的微小改变 */ alphaDelta = -alphaDelta; panel.alpha += alphaDelta; } } }
我们只要在屏幕区域大小改变时,显示调用一次同样窗口区域大小的setResolution()函数就能将
更新的窗口拖拽区域同步到NGUI了,同理,我们更改一次微小变化的panel.alpah值,就能让NGUI
来帮助你更新出失真的dynamic font了,如此一来,便能很好的解决这个问题了,而且性能开销也
很小,所以遇到这个问题的朋友可以借鉴一下。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。