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

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

 更新時(shí)間:2021年04月13日 14:17:41   作者:超人不會(huì)死  
這篇文章主要介紹了解決在Unity中使用FairyGUI遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

首先!首先!首先!

首先,我們由于歷史問(wèn)題,項(xiàng)目用的UI編輯器不是大眾使用的GUI或者NGUI, 而是使用不知道算不算小眾的FairyGUI,這個(gè)UI系統(tǒng)使用挺方便的,也提供了很多UI編碼的案例,至少?gòu)闹苯邮褂脕?lái)說(shuō)方便了不少。

但是!但是!但是!

可能用到這個(gè)UI編輯器的不是那么多,項(xiàng)目上遇到的問(wèn)題在網(wǎng)上百度出來(lái)的結(jié)果很少,基本自己斷點(diǎn)查找bug。

最后!最后!最后!

我這個(gè)從沒(méi)寫(xiě)過(guò)幾次技術(shù)博客的人,要寫(xiě)這篇技術(shù)貼的原因是:昨晚加班到四五點(diǎn)鐘查找BUG回到屋里,發(fā)現(xiàn)由于沒(méi)有關(guān)好自己臥室的門(mén),室友養(yǎng)的貓進(jìn)我屋里尿了我一床,所以不得不馬上更換棉被,才取睡覺(jué)!

1.關(guān)于在FairyGUI中使用Unity項(xiàng)目里的Sprite問(wèn)題

在FairyGUI中使用Unity的Sprite需要使用控件GLoader來(lái)裝載Sprite.官方給予的使用方法是

//Unity, 這里加載的是路徑為Assets/Resources/demo/aimage的一個(gè)貼圖
aLoader.url = “demo/aimage”;

如果Sprite是在一個(gè)Sprite圖集中,則需要重寫(xiě)自己的GLoader類,

class MyGLoader  : GLoader
{
    override protected function LoadExternal()
    {
        /*
        開(kāi)始外部載入,地址在url屬性
        載入完成后調(diào)用OnExternalLoadSuccess
        載入失敗調(diào)用OnExternalLoadFailed
        注意:如果是外部載入,在載入結(jié)束后,調(diào)用OnExternalLoadSuccess或OnExternalLoadFailed前,
        比較嚴(yán)謹(jǐn)?shù)淖龇ㄊ窍葯z查url屬性是否已經(jīng)和這個(gè)載入的內(nèi)容不相符。
        如果不相符,表示loader已經(jīng)被修改了。
        這種情況下應(yīng)該放棄調(diào)用OnExternalLoadSuccess或OnExternalLoadFailed。
        */
    }
    override protected function FreeExternal(NTexture texture)
    {
        //釋放外部載入的資源
    }
}

并且注冊(cè)自己的GLoader

UIObjectFactory.SetLoaderExtension(typeof(MyGLoader));

但是這里并沒(méi)有告訴我們?cè)撛鯓泳唧w加載Sprite.

實(shí)際上只需要自己查找到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是在一個(gè)圖集中,圖片就顯示不正確了。

查找了很久才發(fā)現(xiàn)FairyGUI使用的圖集和Unity中使用的圖集Y軸相反,需要重新計(jì)算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 問(wèn)題。

2.使用Sprite Atlas打包圖集遇到的問(wèn)題

由于美術(shù)給予的圖片都是單個(gè)的圖片,并沒(méi)有將打包成為一張圖片,所以需要程序自行打包。在多次詢問(wèn)谷哥和度娘以后,才知道Unity有個(gè)新的圖集打包插件Sprite Atlas很好使用

1.創(chuàng)建Sprite Atlas:

創(chuàng)建Sprite Atlas

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

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

也可以打包預(yù)制體

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

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

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

這里就已經(jīng)完成圖集打包了。

一切似乎都很完美,圖片顯示,打包都有了。

但是!但是!但是

圖集+Gloader顯示圖片后,圖片顯示不出來(lái)了,

查了很久才知道

// 獲取精靈在其紋理上使用的矩形。如果這個(gè)精靈被緊緊地打包在一個(gè)地圖集中,則引發(fā)一個(gè)異常。
textureRect   Get the rectangle this sprite uses on its texture. Raises an exception if this sprite is tightly packed in an atlas.

我TM一萬(wàn)匹草泥馬奔過(guò),這TM也是我昨晚查了一晚上,Debug了好久查找怎么正確獲取textureRect,或者說(shuō)能正常顯示圖片。

我發(fā)現(xiàn)如果要顯示圖片可以使用GGraph:

// FairyGUI官方給予的案例
GGraph holder = new GGraph();
holder.SetSize(100, 100);
holder.DrawRect(...);
aComponent.AddChild(holder);
holder.SetNativeObject(aSprite);

但是這里裝載的aSprite是一個(gè)GameObject對(duì)象,相當(dāng)于我創(chuàng)建了一個(gè)GameObject掛載到了FairyGUI上。

這里我不可能1.將所有的GLoader改成GGraph吧,2.為每張需要用到的圖片創(chuàng)建GameObject吧。

后來(lái)根據(jù)官方的案例發(fā)現(xiàn)可以,

Texture2D tTx2D = Resources.Load<Texture2D>(strPath);
this.onExternalLoadSuccess(new NTexture(tTx2D));

但是這里加載的Texture2D是整個(gè)圖片,如果是圖片中的某塊區(qū)域(圖集中的一張圖片)則無(wú)法正常顯示。

最后我發(fā)現(xiàn),在創(chuàng)建Sprite Atlas時(shí),取消勾選Tight Packing(取消緊湊打包),屬性textureRect就可以正常獲取了。

取消緊湊打包

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

最新評(píng)論