解決在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)的貓進(jìn)我屋里尿了我一床,所以不得不馬上更換棉被,才取睡覺!
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前,
比較嚴(yán)謹(jǐn)?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)的圖片一起打包)
也可以打包預(yù)制體

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對象,相當(dāng)于我創(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)多旋翼無人機(jī)的模擬飛行
- 在Unity中使用全局變量的操作
- unity 切換場景不銷毀物體問題的解決
- Unity 靜態(tài)變量跨場景操作
- Unity3D 單例模式和靜態(tài)類的使用詳解
- Unity 讀取文件 TextAsset讀取配置文件方式
- Unity3d 如何更改Button的背景色
- Unity3d使用FairyGUI 自定義字體的操作
- Unity3D運(yùn)行報DllNotFoundException錯誤的解決方案
- Unity游戲之存儲數(shù)據(jù)
相關(guān)文章
C#中winform實現(xiàn)自動觸發(fā)鼠標(biāo)、鍵盤事件的方法
這篇文章主要介紹了C#中winform實現(xiàn)自動觸發(fā)鼠標(biāo)、鍵盤事件的方法,是C#程序設(shè)計中非常實用的功能,需要的朋友可以參考下2014-08-08
C#如何Task執(zhí)行任務(wù),等待任務(wù)完成
這篇文章主要介紹了C#如何Task執(zhí)行任務(wù),等待任務(wù)完成,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
c#通過進(jìn)程調(diào)用cmd判斷登錄用戶權(quán)限代碼分享
最近自己開發(fā)軟件需要讀取本地配置文件,因為登錄用戶的權(quán)限不夠會導(dǎo)致無法讀取文件進(jìn)而導(dǎo)致程序崩潰,查了一些解決方法,代碼分享如下2013-12-12
VS2019屬性管理器沒有Microsoft.Cpp.x64.user的解決辦法
這篇文章主要介紹了VS2019屬性管理器沒有Microsoft.Cpp.x64.user的解決辦法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
Unity圖形學(xué)之ShaderLab入門基礎(chǔ)
Unity中所有Shader文件都通過一種陳述性語言進(jìn)行描述,稱為“ShaderLab”, 這篇文章主要介紹了Unity圖形學(xué)之ShaderLab入門基礎(chǔ),需要的朋友可以參考下2022-01-01

