溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

關(guān)于unity 中使用AssetBundle加載資源,shader偶爾會(huì)丟失的問題解決辦法

發(fā)布時(shí)間:2020-07-27 19:49:35 來源:網(wǎng)絡(luò) 閱讀:10407 作者:chenshulove 欄目:開發(fā)技術(shù)

問題描述:

  因?yàn)轫?xiàng)目中要進(jìn)行熱更新設(shè)計(jì),所以用unity官方推薦的打包方式assetbundle進(jìn)行打包,打包好了以后再電腦上運(yùn)行正常,但是當(dāng)發(fā)布到android上后發(fā)現(xiàn)偶爾場景背景會(huì)出現(xiàn)空白,多方查找,發(fā)現(xiàn)unity存在使用assetbundle加載資源會(huì)丟失shader的問題。網(wǎng)上找了一些解決方式,測試可用,分享出來。


方案一:(親測可用)

第一步,在將用到的Shader加到Editor->Graphics Settings的Shader列表里再進(jìn)行打包(依賴打包)

第二步,在代碼中給shader再次賦值,代碼如下:

   public static void ResetShader(UnityEngine.Object obj)

    {

        List<Material> listMat = new List<Material>();

        listMat.Clear();


        if (obj is Material)

        {

            Material m = obj as Material;

            listMat.Add(m);

        }

        else if (obj is GameObject)

        {

            GameObject go = obj as GameObject;

            Renderer[] rends = go.GetComponentsInChildren<Renderer>();

            if (null != rends)

            {

                foreach (Renderer item in rends)

                {

                    Material[] materialsArr = item.sharedMaterials;

                    foreach (Material m in materialsArr)

                        listMat.Add(m);

                }

            }


        }


        for (int i = 0; i < listMat.Count; i++)

        {

            Material m = listMat[i];

            if (null == m)

                continue;

            var shaderName = m.shader.name;

            var newShader = Shader.Find(shaderName);

            if (newShader != null)

                m.shader = newShader;

        }

    }

  經(jīng)過這兩步后,基本可以解決丟shader問題。

方案二:

  1. 依賴打包

  2. shader放到Resources文件夾,必須是Resources文件夾里。

方案二是我在網(wǎng)上看到的,其實(shí)方案一用的也是依賴打包,shader雖然沒放到Resources目錄下,不過也沒有再出現(xiàn)丟shader的問題。


  我剛才說“基本可以解決”丟shader問題,是因?yàn)檫€有一些情況是沒有解決掉的,如下:

一、spine動(dòng)畫資源

  在把spine動(dòng)畫資源進(jìn)行了依賴打包后,發(fā)現(xiàn)總是會(huì)丟失材質(zhì)(shader),使用方案一,方案二都無效,因?yàn)閟pine動(dòng)畫資源是做成prefab的,依賴也都加載了,依賴加載順序也沒錯(cuò),關(guān)鍵是丟材質(zhì)(shader)的情況不是必現(xiàn),所以就很難查到問題。無奈只好只打包spine動(dòng)畫資源原文件(.json,.atlas,.png三個(gè)文件),然后在代碼中創(chuàng)建spine組件,初始化。不過問題又來了,那就是創(chuàng)建spine組件很耗時(shí),加載方式也只能改為預(yù)加載,雖然這個(gè)解決方式并不滿意,但因?yàn)闆]有找到更好的方式,就暫時(shí)先這樣。至于,spine動(dòng)畫在代碼中創(chuàng)建的方法,會(huì)另寫博文與大家分享。

二、NGUI的圖集有時(shí)會(huì)丟材質(zhì)(shader)

  這個(gè)現(xiàn)象也不是必現(xiàn)的,在電腦上一切正常,但發(fā)布到android上就有一定的幾率會(huì)丟材質(zhì)(shader),試了幾次都不行,就把圖集放到了Resoures目錄下,用Resoures.Load進(jìn)行加載。


在此也發(fā)一下求助,有能解決這兩個(gè)問題的好方案,還請(qǐng)您不吝賜教!先行謝過。


歡迎大家評(píng)論指正,很樂意與大家一同成長。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI