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, Screen.fullScreen);
            screen = new Vector2(Screen.width, Screen.height);

            /*
             * 如果設置爲同樣的值,NGUI會考慮到效率,所以不會重新設置,
             * 所以用delta來設置看不見的微小改變
             */
            alphaDelta = -alphaDelta;
            panel.alpha += alphaDelta;
        }

	}
}

 我們只要在屏幕區域大小改變時,顯示調用一次同樣窗口區域大小的setResolution()函數就能將

更新的窗口拖拽區域同步到NGUI了,同理,我們更改一次微小變化的panel.alpah值,就能讓NGUI

來幫助你更新出失真的dynamic font了,如此一來,便能很好的解決這個問題了,而且性能開銷也

很小,所以遇到這個問題的朋友可以借鑑一下。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章