欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決在Unity中使用FairyGUI遇到的坑

 更新時間:2021年04月13日 14:17:41   作者:超人不會死  
這篇文章主要介紹了解決在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:

創(chuàng)建Sprite Atlas

2.選擇需要打包的圖片或者圖片所在的文件夾

(這里會將文件夾內(nèi)的圖片和子文件夾內(nèi)的圖片一起打包)

也可以打包預制體

選擇需要打包的圖片或者圖片所在的文件夾

3.設(shè)置在編輯器模式下也可以使用打包功能

設(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

最新評論