NGUI自適應屏幕分辨率


  unity官方承諾的新ui系統一直沒有推出來,我們的UI使用的是原生的OnGUI系統,剛好UI需要改版,索性就想遷到NGUI上面來,於是看了一下NGUI源碼,發現NGUI可以大大的降低DrawCall,減輕GPU負擔,但是各個組件類上面,也有很多浪費cpu的運算可以改進,這一點對開發移動平台的游戲一定很重要。因此需要對他有針對性的做一些修改,以適應自己的需要。

  在遷移過程中,首先要解決的問題就是屏幕分辨率的問題,因為我們是開發移動平台的游戲,分辨率當時是設定在800*480像素,用OnGUI可以很容易解決分辨率的適配問題。看了NGUI的文檔和源碼,發現NGUI提供了3種分辨率解決方案。

  第一種是像素匹配,也就是UIRoot組件上面的設置Scaling為Pixelperfect。采用這種模式,如果在設計階段一條垂直支線占用100個像素,那么在各個分辨率下面都只占用100個像素。這種樣式如果頁游或者端游上面設計固定像素大小的界面還是可以的,畢竟游戲窗口大,像素空間占比也不小,在不同的分辨率下面界面不會變形太多,但是如果放在移動平台上面,相同尺寸的屏幕,分辨率可以從幾百變換到幾千,像素密度差異非常大,比如在某個低端機上面,50個像素已經占據很大的屏幕空間了,但是到一個分辨率非常大的手機上面,50個像素只占據一點點屏幕空間了,這就造成一個問題,在低端機上面很清晰地界面到高端機上面會變小到甚至看不清楚了。

  第二種是固定尺寸,Scaling設置為FixedSize,這種模式下,界面占用的像素會等比縮放,但是他只提供了根據高度縮放。比如采用這種模式,你設置100像素高的界面,到了某個某個分比率下像素高翻一倍的屏幕上,界面會占用200像素高。很好,這不就是我們需要的嗎?且慢,他提供的是根據高度來等比縮放的,但是現在的手機各種奇葩的寬高比都有,寬與高不是等比的,如果你設計了一個占滿屏幕的背景,切換到另一個分辨率下,高度會剛好充滿,但是寬呢?因為不是等比,所以會留下兩邊的黑邊。這不是我們希望看到的。

  第三種方式是通過錨定,NGUI3.07以后的版本UIPanel和UiWidgt都是繼承自UIRect,UiRect提供了四個錨定變量。比如設計一個背景框,把左右上下都錨定在根物體四個角上面,這樣就實現了自適應分辨率的縮放。這確實滿足了我們的需求,可是想想如果每個ui都要這樣去設定,那也太麻煩了,而且采用Anchor的做法,會每幀都會浪費cpu去計算相對位置(還沒有分析這一部分源碼,不確定),而且每個UI都會有四個新增的anchor變量,也會浪費珍貴的終端內存。所以我打算把anchor去掉。

  那有沒有別的方法呢?當然有,而且相當簡單。NGUI為什么會對高度自適應呢?應為他對跟物體用2/manulHeight進行了縮放,這個縮放的意義是什么呢?為什么是用2來除呢?因為設計2dUI的時候,我們相機是采用正交投影模式,正交投影的視體是一個長方體,正交投影攝像機有個orthographicSize屬性,我們把它設為1,他的意思是投影相機的視體半高為1,也就是這個視體的y軸是-1到1,高度一共為2,2的高度映射着整個屏幕高度,所以用2除以設置高度后,就可以在該高度進行界面設計,假定我們設計UI是800*480,我們就可以把manulHeigh設置為480,這樣,root下的子物體,1就代表着1個像素,加入我們設計了一個240高度的界面,整個界面搞就占據了50%的屏幕高,切換一個不同高度的屏幕后,還是占據50%的屏幕高這樣,就實現了針對高度的等比縮放了,那么寬度呢?同理啊,在Scaling里面添加一個新的樣式 ,fixedSizeBoth,然后添加一個變量manulWidth, 對root的x軸所用 用  2*Screen.aspect/manulWidth縮放就可以了。 為什么要用2*Screen.aspect,自己去看看unity文檔和3d方面的知識把。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM