Example #1
0
    private static bool LoadDependenicesResourceAsync(ResConfigData pefabConfig, out PrefabDependenciesResNode dependenciesRes,
                                                      out List <ResNode> RequestResList)
    {
        RequestResList  = null;
        dependenciesRes = null;

        //取得依赖配置表
        PrefabDependenicesResConfigData dependenciesConfig = null;
        int prefabID = GUIDToInstanceID(pefabConfig.AssetGUID);

        if (!m_PrefabDependenciesConfigTable.TryGetValue(pefabConfig.AssetGUID, out dependenciesConfig))
        {
            Debug.LogWarning("预制体找不到对应的依赖配置:" + pefabConfig.AssetBundleName + "[" + pefabConfig.AssetName + "]");
            return(false);
        }

        /*先来检测一下,看看是不是已经存在了资源加载,因为这是有BUG的。
         * 理论上来说,没有被加载到,就不会有依赖资源被保存起来,如果发现目标资源没有被加载,但是
         * 他的依赖资源被加载的情况,这就是bug,主要问题就出在释放的时候,没有释放掉对应的依赖资源
         */


        if (m_PrefabDependenciesResNodeTable.TryGetValue(prefabID, out dependenciesRes))
        {
            Debug.LogWarning("!!!!!!!!!!!!!!天哪撸,出超级大bug了。资源系统出大问题了。这个问题,赶紧找程序解决!!!!!!!!:" + pefabConfig.AssetBundleName + "[" + pefabConfig.AssetName + "]");
            return(false);
        }

        RequestResList  = new List <ResNode>();
        dependenciesRes = new PrefabDependenciesResNode();
        List <ResNode> TempDependenceList = new List <ResNode>();

        /*加载顺序是不能乱的,要是乱的话。你可以试试,只要有一个加载失败就退出*/

        //先加载贴图,分 一下是Sprite还是普通图
        foreach (string resGUID in dependenciesConfig.TextureResConfigDatas)
        {
            ResConfigData tex = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[贴图]");
                return(false);
            }


            ResNode currRes = null;
            bool    b       = IsUIAssetBundle(tex.AssetBundleName);

            if (b)
            {
                currRes = GetSpriteResourceAsync(tex, AsyncLoadDependenicesCallBack, null, pefabConfig.priority);
            }
            else
            {
                currRes = GetTextureResourceAsync(tex, AsyncLoadDependenicesCallBack, null, pefabConfig.priority);
            }

            if (null != currRes)
            {
                RequestResList.Add(currRes);
                dependenciesRes.TextureResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[贴图],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }

        //再加载材质
        foreach (string resGUID in dependenciesConfig.MaterialResConfigDatas)
        {
            ResConfigData tex = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[Material]");
                return(false);
            }
            ResNode currRes = GetMaterialResourceAsync(tex, AsyncLoadDependenicesCallBack, null, pefabConfig.priority);
            if (null != currRes)
            {
                RequestResList.Add(currRes);
                dependenciesRes.MaterialResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[Material],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }


        //再加载AnimatorClip
        foreach (string resGUID in dependenciesConfig.AnimatonClipResConfigDatas)
        {
            ResConfigData tex = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[AnimatorClip]");
                return(false);
            }
            ResNode currRes = GetAnimationClipResourceAsync(tex, AsyncLoadDependenicesCallBack, null, pefabConfig.priority);
            if (null != currRes)
            {
                RequestResList.Add(currRes);
                dependenciesRes.AnimatonClipResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[AnimatorClip],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }


        //再加载FBX
        foreach (string resGUID in dependenciesConfig.FBXResConfigDatas)
        {
            ResConfigData tex = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[FBX]");
                return(false);
            }
            ResNode currRes = GetFBXResourceAsync(tex, AsyncLoadDependenicesCallBack, null, pefabConfig.priority);
            if (null != currRes)
            {
                RequestResList.Add(currRes);
                dependenciesRes.FBXResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[FBX],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }


        //再加载AnimatorController
        foreach (string resGUID in dependenciesConfig.AnimatorControllerResConfigDatas)
        {
            ResConfigData tex = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[AnimatorController]");
                return(false);
            }
            ResNode currRes = GetAnimatorControllerResourceAsync(tex, AsyncLoadDependenicesCallBack, null, pefabConfig.priority);
            if (null != currRes)
            {
                RequestResList.Add(currRes);
                dependenciesRes.AnimatorControllerResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[AnimatorController],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }
        return(true);
    }
Example #2
0
    /// <summary>
    /// 只加载预制体的资源依赖
    /// </summary>
    /// <param name="pefabConfig"></param>
    /// <returns></returns>
    private static bool LoadDependenicesResource(ResConfigData pefabConfig, out PrefabDependenciesResNode dependenciesRes)
    {
        int guid = GUIDToInstanceID(pefabConfig.AssetGUID);

        dependenciesRes = null;

        //取得依赖配置表
        PrefabDependenicesResConfigData dependenciesConfig = null;

        if (!m_PrefabDependenciesConfigTable.TryGetValue(pefabConfig.AssetGUID, out dependenciesConfig))
        {
            Debug.LogWarning("预制体找不到对应的依赖配置:" + pefabConfig.AssetBundleName + "[" + pefabConfig.AssetName + "]");
            return(false);
        }


        if (m_PrefabDependenciesResNodeTable.TryGetValue(guid, out dependenciesRes))
        {
            Debug.LogWarning("!!!!!!!!!!!!!!天哪撸,出超级大bug了。资源系统出大问题了。这个问题,赶紧找程序解决!!!!!!!!:" + pefabConfig.AssetBundleName + "[" + pefabConfig.AssetName + "]");
            return(false);
        }

        dependenciesRes = new PrefabDependenciesResNode();

        /*加载顺序是不能乱的,要是乱的话。你可以试试,只要有一个加载失败就退出*/



        //先加载贴图,贴图要区分是Sprite还是普通的Texture
        foreach (string resGUID in dependenciesConfig.TextureResConfigDatas)
        {
            ResNode       currRes = null;
            ResConfigData tex     = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[贴图]");
                return(false);
            }
            if (IsUIAssetBundle(tex.AssetBundleName))
            {
                currRes = GetSpriteResource(tex);
            }
            else
            {
                currRes = GetTextureResource(tex);
            }

            if (null != currRes && currRes.IsValid())
            {
                dependenciesRes.TextureResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[贴图],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }

        //再加载材质
        foreach (string resGUID in dependenciesConfig.MaterialResConfigDatas)
        {
            ResConfigData tex = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[Material]");
                return(false);
            }

            ResNode currRes = GetMaterialResource(tex);
            if (null != currRes && currRes.IsValid())
            {
                dependenciesRes.MaterialResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[Material],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }

        //再加载AnimatorClip
        foreach (string resGUID in dependenciesConfig.AnimatonClipResConfigDatas)
        {
            ResConfigData tex = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[AnimatorClip]");
                return(false);
            }
            ResNode currRes = GetAnimationClipResource(tex);
            if (null != currRes && currRes.IsValid())
            {
                dependenciesRes.AnimatonClipResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[AnimatorClip],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }

        //再加载FBX
        foreach (string resGUID in dependenciesConfig.FBXResConfigDatas)
        {
            ResConfigData tex = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[FBX]");
                return(false);
            }
            ResNode currRes = GetFBXResource(tex);
            if (null != currRes && currRes.IsValid())
            {
                dependenciesRes.FBXResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[FBX],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }



        //再加载AnimatorController
        foreach (string resGUID in dependenciesConfig.AnimatorControllerResConfigDatas)
        {
            ResConfigData tex = GetDependenicesConfig(resGUID);
            if (null == tex)
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,依赖表中找不到资源,类型:[AnimatorController]");
                return(false);
            }

            ResNode currRes = GetAnimatorControllerResource(tex);
            if (null != currRes && currRes.IsValid())
            {
                dependenciesRes.AnimatorControllerResNode.Add(currRes);
            }
            else
            {
                Debug.LogWarning(pefabConfig.AssetName + "-预制体依赖资源加载失败,类型:[AnimatorController],资源路径:" + tex.AssetBundleName + "--" + tex.AssetName);
                return(false);
            }
        }

        return(true);
    }
Example #3
0
    private static void Export_PrefabSelfConfig(Dictionary <string, Dictionary <string, UnionResConfigData> > configTable = null,
                                                Dictionary <string, PrefabDependenicesResConfigData> depedenceResult      = null)
    {
        string dic = System.IO.Path.GetDirectoryName(AssetBundleManager.GetPrefabConfigPath());

        if (!System.IO.Directory.Exists(dic))
        {
            System.IO.Directory.CreateDirectory(dic);
        }
        if (null == configTable || depedenceResult == null)
        {
            configTable     = AssetBundleManager.PrefabConfigTable;
            depedenceResult = AssetBundleManager.PrefabDependenciesConfigTable;
        }
        StreamWriter writer = new StreamWriter(AssetBundleManager.GetPrefabConfigPath(), false, new System.Text.UTF8Encoding(true));

        foreach (KeyValuePair <string, Dictionary <string, UnionResConfigData> > par in configTable)
        {
            foreach (KeyValuePair <string, UnionResConfigData> valpar in par.Value)
            {
                UnionResConfigData config = valpar.Value;

                //首先,取出预制的依赖配置
                PrefabDependenicesResConfigData dependenicesData = null;
                if (!depedenceResult.TryGetValue(config.AssetGUID, out dependenicesData))
                {
                    //Debug.LogWarning("预制体:" + config.AssetName + ",没有资源依赖~");
                }

                //先写入预制体信息,预制体信息格式为:包名,资源名,GUID,合并后的文件索引,其实位置,长度,贴图数量,FBX数量,AnimationClip数量,AnimatorController数量
                string s = string.Empty;
                s += config.AssetBundleName;
                s += ",";

                s += config.AssetName;
                s += ",";

                s += config.AssetGUID;
                s += ",";

                s += config.unionIndx;
                s += ",";

                s += config.startIndex;
                s += ",";

                s += config.dataLength;
                s += ",";

                //这个预制体没有依赖的资源
                if (null == dependenicesData)
                {
                    //贴图
                    s += 0;
                    s += ",";

                    //fbx
                    s += 0;
                    s += ",";

                    //clip
                    s += 0;
                    s += ",";

                    //controller
                    s += 0;
                    s += ",";

                    //shader
                    s += 0;
                    s += ",";

                    //material
                    s += 0;

                    //然后就可以写入到文件了.
                    writer.WriteLine(s);
                }
                else
                {
                    s += dependenicesData.TextureResConfigDatas.Count;
                    s += ",";

                    s += dependenicesData.FBXResConfigDatas.Count;
                    s += ",";

                    s += dependenicesData.AnimatonClipResConfigDatas.Count;
                    s += ",";

                    s += dependenicesData.AnimatorControllerResConfigDatas.Count;
                    s += ",";

                    s += dependenicesData.ShaderResConfigDatas.Count;
                    s += ",";

                    s += dependenicesData.MaterialResConfigDatas.Count;

                    //然后就可以写入到文件了.
                    writer.WriteLine(s);

                    /*写完依赖的数目之后,就可以另起一行,开始写入具体的数据*/

                    //先写入贴图
                    foreach (string cof in dependenicesData.TextureResConfigDatas)
                    {
                        writer.WriteLine(cof);
                    }

                    //再写FBX

                    foreach (string cof in dependenicesData.FBXResConfigDatas)
                    {
                        writer.WriteLine(cof);
                    }

                    //再写clip

                    foreach (string cof in dependenicesData.AnimatonClipResConfigDatas)
                    {
                        writer.WriteLine(cof);
                    }


                    //再写controller

                    foreach (string cof in dependenicesData.AnimatorControllerResConfigDatas)
                    {
                        writer.WriteLine(cof);
                    }

                    //再写shader
                    foreach (string cof in dependenicesData.ShaderResConfigDatas)
                    {
                        writer.WriteLine(cof);
                    }


                    //再写材质球
                    foreach (string cof in dependenicesData.MaterialResConfigDatas)
                    {
                        writer.WriteLine(cof);
                    }
                }
            }
        }

        writer.Flush();
        writer.Close();
    }
Example #4
0
    public static void PushPrefabConfig(UnionResConfigData prefabConfig, List <string> TextureData, List <string> FBXData,
                                        List <string> ClipData, List <string> ControllerData, List <string> ShaderData,
                                        List <string> MaterialData)
    {
        if (null == prefabConfig)
        {
            return;
        }
        /*先添加到预制体表里去*/

        Dictionary <string, UnionResConfigData> assetTable = null;

        UnionResConfigData cof;
        int InstanceID = GUIDToInstanceID(prefabConfig.AssetGUID);

        //如果这个预制体已经存在了,那么移除原来的预制体,再添加进去,存在多份一样的预制体信息
        if (m_PrefabGUIDConfigTable.TryGetValue(InstanceID, out cof))
        {
            //移除原来的
            m_PrefabConfigTable[cof.AssetBundleName].Remove(m_PrefabGUIDConfigTable[InstanceID].AssetName);
        }
        else
        {
            m_PrefabGUIDConfigTable.Add(InstanceID, prefabConfig);
        }

        if (m_PrefabConfigTable.TryGetValue(prefabConfig.AssetBundleName, out assetTable))
        {
            //对于已经存在的资源,则采取更新对应的资源
            if (assetTable.ContainsKey(prefabConfig.AssetName))
            {
                assetTable[prefabConfig.AssetName] = prefabConfig;
            }
            else
            {
                assetTable.Add(prefabConfig.AssetName, prefabConfig);
            }
        }
        else
        {
            assetTable = new Dictionary <string, UnionResConfigData>();
            assetTable.Add(prefabConfig.AssetName, prefabConfig);
            m_PrefabConfigTable.Add(prefabConfig.AssetBundleName, assetTable);
        }

        bool isNeedToWriteDependenices = !(TextureData.Count == 0 && FBXData.Count == 0 && ClipData.Count == 0 && ControllerData.Count == 0 && ShaderData.Count == 0 && MaterialData.Count == 0);

        if (!isNeedToWriteDependenices)
        {
            //如果他不需要写入配置,那么检查一下原来是不是有,有的话直接移除
            if (m_PrefabDependenciesConfigTable.ContainsKey(prefabConfig.AssetGUID))
            {
                m_PrefabDependenciesConfigTable.Remove(prefabConfig.AssetGUID);
            }
            return;
        }

        //1.先创建类
        PrefabDependenicesResConfigData dependenicesConfig = null;

        if (!m_PrefabDependenciesConfigTable.TryGetValue(prefabConfig.AssetGUID, out dependenicesConfig))
        {
            dependenicesConfig = new PrefabDependenicesResConfigData();
            m_PrefabDependenciesConfigTable.Add(prefabConfig.AssetGUID, dependenicesConfig);
        }
        else
        {
            //已经存在的,则清楚资源,更新
            dependenicesConfig.TextureResConfigDatas.Clear();
            dependenicesConfig.FBXResConfigDatas.Clear();
            dependenicesConfig.AnimatonClipResConfigDatas.Clear();
            dependenicesConfig.AnimatorControllerResConfigDatas.Clear();
            dependenicesConfig.ShaderResConfigDatas.Clear();
            dependenicesConfig.MaterialResConfigDatas.Clear();
        }
        //先贴图
        for (int i = 0; i < TextureData.Count; i++)
        {
            if (null != TextureData[i])
            {
                dependenicesConfig.TextureResConfigDatas.Add(TextureData[i]);
            }
        }

        //再fbx
        for (int i = 0; i < FBXData.Count; i++)
        {
            if (null != FBXData[i])
            {
                dependenicesConfig.FBXResConfigDatas.Add(FBXData[i]);
            }
        }

        //再clip
        for (int i = 0; i < ClipData.Count; i++)
        {
            if (null != ClipData[i])
            {
                dependenicesConfig.AnimatonClipResConfigDatas.Add(ClipData[i]);
            }
        }

        //再controller
        for (int i = 0; i < ControllerData.Count; i++)
        {
            if (null != ControllerData[i])
            {
                dependenicesConfig.AnimatorControllerResConfigDatas.Add(ControllerData[i]);
            }
        }

        //再shader
        for (int i = 0; i < ShaderData.Count; i++)
        {
            if (null != ShaderData[i])
            {
                dependenicesConfig.ShaderResConfigDatas.Add(ShaderData[i]);
            }
        }

        //再材质球
        for (int i = 0; i < MaterialData.Count; i++)
        {
            if (null != MaterialData[i])
            {
                dependenicesConfig.MaterialResConfigDatas.Add(MaterialData[i]);
            }
        }
    }
Example #5
0
    /// <summary>
    /// 加载预制体配置
    /// </summary>
    private static void LoadPrefabSelfConfig(Dictionary <string, Dictionary <string, UnionResConfigData> > result = null,
                                             Dictionary <string, PrefabDependenicesResConfigData> depedenceResult = null)
    {
        string patch = AssetBundleManager.GetPrefabConfigPath();

        if (!File.Exists(patch))
        {
            if (Application.isPlaying)
            {
                Debug.LogError("找不到预制体配置!!!-" + patch);
            }
            return;
        }
        string stSchemeAllText = DeCodeAssetFile(patch);

        if (stSchemeAllText.Equals(string.Empty))
        {
            return;
        }

        if (result == null || depedenceResult == null)
        {
            result          = m_PrefabConfigTable;
            depedenceResult = m_PrefabDependenciesConfigTable;
        }

        ////去掉\n,因为ScpReader以"\r"分割
        //stSchemeAllText = stSchemeAllText.Replace("\n", "");
        ////再干掉最后的"\r"
        //stSchemeAllText = stSchemeAllText.Remove(stSchemeAllText.Length - 1, 1);

        AssetBundleConfigReader PrefabReader = new AssetBundleConfigReader(stSchemeAllText, "PrefabConfig", 0);


        bool isNeedLoadDependenices          = false; //是否需要加载依赖配置
        UnionResConfigData currLoadingPrefab = null;  //当前正在加载的Prefab
        int texcount        = 0;                      //贴图数目
        int fbxcount        = 0;                      //fbx数目
        int clipcount       = 0;                      //clip数目
        int controllercount = 0;                      //animatorcontroller数目
        int shadercount     = 0;                      //shader数目
        int materialcount   = 0;                      //材质球数目

        string lowerPrefabCommonPatch = PrefabCommonPatch.ToLower();

        for (int i = 0; i < PrefabReader.GetRecordCount(); ++i)
        {
            isNeedLoadDependenices = !(texcount == 0 && fbxcount == 0 &&
                                       clipcount == 0 && controllercount == 0 &&
                                       shadercount == 0 && materialcount == 0);
            if (!isNeedLoadDependenices)
            {
                UnionResConfigData prefabConfig = new UnionResConfigData();
                prefabConfig.AssetBundleName = PrefabReader.GetString(i, (int)PrefabConfigCol.COL_AssetBundleName, string.Empty);
                prefabConfig.AssetName       = PrefabReader.GetString(i, (int)PrefabConfigCol.COL_AssetName, string.Empty);
                prefabConfig.AssetGUID       = PrefabReader.GetString(i, (int)PrefabConfigCol.COL_AssetGUID, string.Empty);
                prefabConfig.unionIndx       = PrefabReader.GetInt(i, (int)PrefabConfigCol.COL_UnionIndex, -1);
                prefabConfig.startIndex      = PrefabReader.GetInt(i, (int)PrefabConfigCol.COL_StartIndex, -1);
                prefabConfig.dataLength      = PrefabReader.GetInt(i, (int)PrefabConfigCol.COL_DataLength, -1);


                if (!prefabConfig.AssetBundleName.EndsWith(PrefabVariant))
                {
                    Debug.LogWarning("预制体配置中有冗余的配置:" + prefabConfig.AssetBundleName + ",名字:" + prefabConfig.AssetName + ",重新生成资源可解决此问题 -- not gameobject");
                    continue;
                }

                texcount        = PrefabReader.GetInt(i, (int)PrefabConfigCol.COL_TextureCount, 0);
                fbxcount        = PrefabReader.GetInt(i, (int)PrefabConfigCol.COL_FBXCount, 0);
                clipcount       = PrefabReader.GetInt(i, (int)PrefabConfigCol.COL_ClipCount, 0);
                controllercount = PrefabReader.GetInt(i, (int)PrefabConfigCol.COL_ControllerCount, 0);
                shadercount     = PrefabReader.GetInt(i, (int)PrefabConfigCol.COL_ShaderCount, 0);
                materialcount   = PrefabReader.GetInt(i, (int)PrefabConfigCol.COL_MaterialCount, 0);

                isNeedLoadDependenices = !(texcount == 0 && fbxcount == 0 &&
                                           clipcount == 0 && controllercount == 0 &&
                                           shadercount == 0 && materialcount == 0);

                if (Application.isPlaying)
                {
                    if (isOnRunTimeMode)
                    {
                        if (prefabConfig.unionIndx < 0 || prefabConfig.startIndex < 0 || prefabConfig.dataLength <= 0)
                        {
                            Debug.LogWarning("无效的预制体配置中有冗余的配置:" + prefabConfig.AssetBundleName + ",名字:" + prefabConfig.AssetName + ",重新生成资源可解决此问题--uniondex < 0");
                            i                     += texcount;
                            i                     += fbxcount;
                            i                     += clipcount;
                            i                     += controllercount;
                            i                     += shadercount;
                            i                     += materialcount;
                            texcount               = 0;
                            fbxcount               = 0;
                            clipcount              = 0;
                            controllercount        = 0;
                            shadercount            = 0;
                            materialcount          = 0;
                            isNeedLoadDependenices = false;
                            currLoadingPrefab      = null;
                            continue;
                        }
                    }
                }

                currLoadingPrefab = prefabConfig;
                int InstanceID = GUIDToInstanceID(prefabConfig.AssetGUID);
                if (m_PrefabGUIDConfigTable.ContainsKey(InstanceID))
                {
                    Debug.LogWarning("重复的预制体配置,GUID:" + prefabConfig.AssetGUID +
                                     "资源名:" + prefabConfig.AssetName);
                    i                     += texcount;
                    i                     += fbxcount;
                    i                     += clipcount;
                    i                     += controllercount;
                    i                     += shadercount;
                    i                     += materialcount;
                    texcount               = 0;
                    fbxcount               = 0;
                    clipcount              = 0;
                    controllercount        = 0;
                    shadercount            = 0;
                    materialcount          = 0;
                    isNeedLoadDependenices = false;
                    currLoadingPrefab      = null;
                    continue;
                }
                else
                {
                    m_PrefabGUIDConfigTable.Add(InstanceID, prefabConfig);
                }

                //把预制体资源先加载进去
                Dictionary <string, UnionResConfigData> assetTable = null;
                if (result.TryGetValue(prefabConfig.AssetBundleName, out assetTable))
                {
                    if (assetTable.ContainsKey(prefabConfig.AssetName))
                    {
                        Debug.LogWarning("预制体:" + prefabConfig.AssetBundleName + "有重复的依赖资源:" + prefabConfig.AssetName);
                        continue;
                    }
                    assetTable.Add(prefabConfig.AssetName, prefabConfig);
                }
                else
                {
                    assetTable = new Dictionary <string, UnionResConfigData>();
                    assetTable.Add(prefabConfig.AssetName, prefabConfig);
                    result.Add(prefabConfig.AssetBundleName, assetTable);

                    //通用预制体
                    if (prefabConfig.AssetBundleName.Contains(lowerPrefabCommonPatch))
                    {
                        PrefabCommonAssetBundleNames.Add(prefabConfig.AssetBundleName);
                    }
                }
                //直接destroy GameObject类型的资源

                //没有依赖的,给一个空配置即可
                if (!isNeedLoadDependenices)
                {
                    depedenceResult.Add(currLoadingPrefab.AssetGUID, new PrefabDependenicesResConfigData());
                }
                continue;
            }

            /*开始加载配置依赖表*/



            //1.先创建类
            PrefabDependenicesResConfigData dependenicesConfig = null;
            if (!depedenceResult.TryGetValue(currLoadingPrefab.AssetGUID, out dependenicesConfig))
            {
                dependenicesConfig = new PrefabDependenicesResConfigData();
                depedenceResult.Add(currLoadingPrefab.AssetGUID, dependenicesConfig);
            }

            //先是贴图
            if (texcount > 0)
            {
                texcount--;
                string guid = StringHelper.CopyString(PrefabReader.GetString(i, 0, string.Empty));
                PushPrefabUnionRes(guid, dependenicesConfig.TextureResConfigDatas);
                continue;
            }

            //再加载FBX
            if (fbxcount > 0)
            {
                fbxcount--;
                string guid = StringHelper.CopyString(PrefabReader.GetString(i, 0, string.Empty));
                PushPrefabUnionRes(guid, dependenicesConfig.FBXResConfigDatas);
                continue;
            }

            //再加载clip
            if (clipcount > 0)
            {
                clipcount--;
                string guid = StringHelper.CopyString(PrefabReader.GetString(i, 0, string.Empty));
                PushPrefabUnionRes(guid, dependenicesConfig.AnimatonClipResConfigDatas);

                continue;
            }

            //再加载controller
            if (controllercount > 0)
            {
                controllercount--;
                string guid = StringHelper.CopyString(PrefabReader.GetString(i, 0, string.Empty));
                PushPrefabUnionRes(guid, dependenicesConfig.AnimatorControllerResConfigDatas);

                continue;
            }

            //再加载shader
            if (shadercount > 0)
            {
                shadercount--;
                string guid = StringHelper.CopyString(PrefabReader.GetString(i, 0, string.Empty));
                PushPrefabUnionRes(guid, dependenicesConfig.ShaderResConfigDatas);
                continue;
            }

            //再加载material
            if (materialcount > 0)
            {
                materialcount--;
                string guid = StringHelper.CopyString(PrefabReader.GetString(i, 0, string.Empty));

                PushPrefabUnionRes(guid, dependenicesConfig.MaterialResConfigDatas);
                continue;
            }
        }

        PrefabReader.Dispose();
        PrefabReader = null;
    }
Example #6
0
    private static void CorrectDependencies()
    {
        if (m_PrefabDependenciesConfigTable.Count <= 0)
        {
            return;
        }

        List <int> tempTextureList       = new List <int>(50);
        List <int> tempMatList           = new List <int>(50);
        List <int> tempAniList           = new List <int>(50);
        List <int> tempFBXList           = new List <int>(50);
        List <int> tempAniControllerList = new List <int>(50);

        List <int> tempDepList = new List <int>(100);

        foreach (PrefabDependenicesResConfigData keyValue in m_PrefabDependenciesConfigTable.Values)
        {
            tempTextureList.Clear();
            tempMatList.Clear();
            tempAniList.Clear();
            tempFBXList.Clear();
            tempAniControllerList.Clear();

            tempDepList.Clear();
            PrefabDependenicesResConfigData dependenciesConfig = keyValue;

            foreach (string resGUID in dependenciesConfig.TextureResConfigDatas)
            {
                int guid = GUIDToInstanceID(resGUID);
                tempTextureList.Add(guid);
            }

            tempDepList.Clear();
            foreach (string resGUID in dependenciesConfig.MaterialResConfigDatas)
            {
                tempDepList.AddRange(tempTextureList);

                int guid = GUIDToInstanceID(resGUID);
                tempMatList.Add(guid);

                PushDependence(guid, tempDepList);
            }

            tempDepList.Clear();
            foreach (string resGUID in dependenciesConfig.AnimatonClipResConfigDatas)
            {
                tempDepList.AddRange(tempMatList);

                int guid = GUIDToInstanceID(resGUID);
                tempAniList.Add(guid);

                PushDependence(guid, tempDepList);
            }

            tempDepList.Clear();
            foreach (string resGUID in dependenciesConfig.FBXResConfigDatas)
            {
                tempDepList.AddRange(tempMatList);
                tempDepList.AddRange(tempAniList);

                int guid = GUIDToInstanceID(resGUID);

                ResConfigData res = GetDependenicesConfig(resGUID);
                tempFBXList.Add(guid);

                PushDependence(guid, tempDepList);
            }

            tempDepList.Clear();
            foreach (string resGUID in dependenciesConfig.AnimatorControllerResConfigDatas)
            {
                tempDepList.AddRange(tempMatList);
                tempDepList.AddRange(tempAniList);
                tempDepList.AddRange(tempFBXList);

                int guid = GUIDToInstanceID(resGUID);
                tempAniControllerList.Add(guid);

                PushDependence(guid, tempDepList);
            }
        }
    }