最近,在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了,如此一來,便能很好的解決這個問題了,而且性能開銷也
很小,所以遇到這個問題的朋友可以借鑑一下。