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了,如此一来,便能很好的解决这个问题了,而且性能开销也

很小,所以遇到这个问题的朋友可以借鉴一下。


 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。