解決在Unity中使用FairyGUI遇到的坑
首先!首先!首先!
首先,我們由于歷史問題,項目用的UI編輯器不是大眾使用的GUI或者NGUI, 而是使用不知道算不算小眾的FairyGUI,這個UI系統(tǒng)使用挺方便的,也提供了很多UI編碼的案例,至少從直接使用來說方便了不少。
但是!但是!但是!
可能用到這個UI編輯器的不是那么多,項目上遇到的問題在網(wǎng)上百度出來的結(jié)果很少,基本自己斷點查找bug。
最后!最后!最后!
我這個從沒寫過幾次技術(shù)博客的人,要寫這篇技術(shù)貼的原因是:昨晚加班到四五點鐘查找BUG回到屋里,發(fā)現(xiàn)由于沒有關(guān)好自己臥室的門,室友養(yǎng)的貓進我屋里尿了我一床,所以不得不馬上更換棉被,才取睡覺!
1.關(guān)于在FairyGUI中使用Unity項目里的Sprite問題
在FairyGUI中使用Unity的Sprite需要使用控件GLoader來裝載Sprite.官方給予的使用方法是
//Unity, 這里加載的是路徑為Assets/Resources/demo/aimage的一個貼圖 aLoader.url = “demo/aimage”;
如果Sprite是在一個Sprite圖集中,則需要重寫自己的GLoader類,
class MyGLoader : GLoader { override protected function LoadExternal() { /* 開始外部載入,地址在url屬性 載入完成后調(diào)用OnExternalLoadSuccess 載入失敗調(diào)用OnExternalLoadFailed 注意:如果是外部載入,在載入結(jié)束后,調(diào)用OnExternalLoadSuccess或OnExternalLoadFailed前, 比較嚴謹?shù)淖龇ㄊ窍葯z查url屬性是否已經(jīng)和這個載入的內(nèi)容不相符。 如果不相符,表示loader已經(jīng)被修改了。 這種情況下應(yīng)該放棄調(diào)用OnExternalLoadSuccess或OnExternalLoadFailed。 */ } override protected function FreeExternal(NTexture texture) { //釋放外部載入的資源 } }
并且注冊自己的GLoader
UIObjectFactory.SetLoaderExtension(typeof(MyGLoader));
但是這里并沒有告訴我們該怎樣具體加載Sprite.
實際上只需要自己查找到Sprite載入就行
protected override void LoadExternal() { // 這里使用成員變量url查找Sprite載入即可 if (url.Length > 0) { Sprite tSprite= Resources.Load<Sprite>(url); this.onExternalLoadSuccess(new NTexture(tSprite)); } this.onExternalLoadFailed(); }
但是如果Sprite是在一個圖集中,圖片就顯示不正確了。
查找了很久才發(fā)現(xiàn)FairyGUI使用的圖集和Unity中使用的圖集Y軸相反,需要重新計算Rect才能正確加載。即
protected override void LoadExternal() { if (url.Length > 0) { Sprite[] tSprites= Resources.LoadAll<Sprite>(url); Sprite tSprite = tSprites[0]; // 這里需要將Y軸反轉(zhuǎn) Rect tShowRect = new Rect(tSprite.textureRect.x, tSprite.texture.height - tSprite.textureRect.y - tSprite.textureRect.height, tSprite.textureRect.width, tSprite.textureRect.height); this.onExternalLoadSuccess(new NTexture(tSprite.texture, tShowRect)); } }
基本上這樣子就解決了GLoader使用Unity的Sprite 問題。
2.使用Sprite Atlas打包圖集遇到的問題
由于美術(shù)給予的圖片都是單個的圖片,并沒有將打包成為一張圖片,所以需要程序自行打包。在多次詢問谷哥和度娘以后,才知道Unity有個新的圖集打包插件Sprite Atlas很好使用
1.創(chuàng)建Sprite Atlas:
2.選擇需要打包的圖片或者圖片所在的文件夾
(這里會將文件夾內(nèi)的圖片和子文件夾內(nèi)的圖片一起打包)
也可以打包預制體
3.設(shè)置在編輯器模式下也可以使用打包功能
這里就已經(jīng)完成圖集打包了。
一切似乎都很完美,圖片顯示,打包都有了。
但是!但是!但是
圖集+Gloader顯示圖片后,圖片顯示不出來了,
查了很久才知道
// 獲取精靈在其紋理上使用的矩形。如果這個精靈被緊緊地打包在一個地圖集中,則引發(fā)一個異常。 textureRect Get the rectangle this sprite uses on its texture. Raises an exception if this sprite is tightly packed in an atlas.
我TM一萬匹草泥馬奔過,這TM也是我昨晚查了一晚上,Debug了好久查找怎么正確獲取textureRect,或者說能正常顯示圖片。
我發(fā)現(xiàn)如果要顯示圖片可以使用GGraph:
// FairyGUI官方給予的案例 GGraph holder = new GGraph(); holder.SetSize(100, 100); holder.DrawRect(...); aComponent.AddChild(holder); holder.SetNativeObject(aSprite);
但是這里裝載的aSprite是一個GameObject對象,相當于我創(chuàng)建了一個GameObject掛載到了FairyGUI上。
這里我不可能1.將所有的GLoader改成GGraph吧,2.為每張需要用到的圖片創(chuàng)建GameObject吧。
后來根據(jù)官方的案例發(fā)現(xiàn)可以,
Texture2D tTx2D = Resources.Load<Texture2D>(strPath); this.onExternalLoadSuccess(new NTexture(tTx2D));
但是這里加載的Texture2D是整個圖片,如果是圖片中的某塊區(qū)域(圖集中的一張圖片)則無法正常顯示。
最后我發(fā)現(xiàn),在創(chuàng)建Sprite Atlas時,取消勾選Tight Packing(取消緊湊打包),屬性textureRect就可以正常獲取了。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
- 在unity腳本中控制Inspector面板的參數(shù)操作
- C#中public變量不能被unity面板識別的解決方案
- Unity使用物理引擎實現(xiàn)多旋翼無人機的模擬飛行
- 在Unity中使用全局變量的操作
- unity 切換場景不銷毀物體問題的解決
- Unity 靜態(tài)變量跨場景操作
- Unity3D 單例模式和靜態(tài)類的使用詳解
- Unity 讀取文件 TextAsset讀取配置文件方式
- Unity3d 如何更改Button的背景色
- Unity3d使用FairyGUI 自定義字體的操作
- Unity3D運行報DllNotFoundException錯誤的解決方案
- Unity游戲之存儲數(shù)據(jù)
相關(guān)文章
C#利用正則表達式實現(xiàn)獲取字符串中漢字的數(shù)量
這篇文章主要為大家詳細介紹了C#如何利用正則表達式實現(xiàn)獲取字符串中漢字的數(shù)量,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-01-01.NET WinForm實現(xiàn)在listview中添加progressbar的方法
這篇文章主要介紹了.NET WinForm實現(xiàn)在listview中添加progressbar的方法,結(jié)合實例形式簡單分析了進度條控件的添加與使用方法,需要的朋友可以參考下2017-05-05避免在C#循環(huán)中使用await的方法小結(jié)
在C#中,異步編程因其能夠提升應(yīng)用程序性能和響應(yīng)能力而變得越來越流行,async和await關(guān)鍵字使得編寫異步代碼變得更加容易,但如果使用不當,它們也可能引入一些陷阱,所以本文我們將探討為什么應(yīng)該避免在C#循環(huán)中使用await,并討論一些更高效地處理異步操作的替代方法2024-09-09Winform實現(xiàn)將網(wǎng)頁生成圖片的方法
這篇文章主要介紹了Winform實現(xiàn)將網(wǎng)頁生成圖片的方法,類似于一般瀏覽器自帶的網(wǎng)頁生成圖片的功能,需要的朋友可以參考下2014-09-09C#實現(xiàn)DataTable轉(zhuǎn)換成IList的方法
這篇文章主要介紹了C#實現(xiàn)DataTable轉(zhuǎn)換成IList的方法,涉及C#針對DataTable操作的相關(guān)技巧,需要的朋友可以參考下2016-03-03