Beispiel #1
0
        public static void LoadCache()
        {
            string cacheTxtFilePath = pathResolver.HashCacheSaveFile;

            if (File.Exists(cacheTxtFilePath))
            {
                string       value = File.ReadAllText(cacheTxtFilePath);
                StringReader sr    = new StringReader(value);

                //版本比较
                string vString  = sr.ReadLine();
                bool   wrongVer = false;
                try
                {
                    Version ver = new Version(vString);
                    wrongVer = ver.Minor < AssetBundleManager.version.Minor || ver.Major < AssetBundleManager.version.Major;
                }
                catch (Exception) { wrongVer = true; }

                if (wrongVer)
                {
                    return;
                }

                //读取缓存的信息
                while (true)
                {
                    string path = sr.ReadLine();
                    if (path == null)
                    {
                        break;
                    }

                    AssetCacheInfo cache = new AssetCacheInfo();
                    cache.fileHash  = sr.ReadLine();
                    cache.metaHash  = sr.ReadLine();
                    cache.bundleCrc = sr.ReadLine();
                    int depsCount = Convert.ToInt32(sr.ReadLine());
                    cache.depNames = new string[depsCount];
                    for (int i = 0; i < depsCount; i++)
                    {
                        cache.depNames[i] = sr.ReadLine();
                    }

                    _fileHashOld[path] = cache;
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// 分析引用关系
        /// </summary>
        public void Analyze()
        {
            if (_isAnalyzed)
            {
                return;
            }
            _isAnalyzed = true;

#if !UNITY_5
            LoadMetaHashIfNecessary();
#endif
            _cacheInfo     = AssetBundleUtils.GetCacheInfo(assetPath);
            _isFileChanged = _cacheInfo == null || !_cacheInfo.fileHash.Equals(GetHash()) || !_cacheInfo.metaHash.Equals(_metaHash);
            if (_cacheInfo != null)
            {
                _bundleCrc = _cacheInfo.bundleCrc;
                if (_isFileChanged)
                {
                    Debug.Log("File was changed : " + assetPath);
                }
            }

            Object[] deps = EditorUtility.CollectDependencies(new Object[] { asset });
#if UNITY_5 || UNITY_2017_1_OR_NEWER
            List <Object> depList = new List <Object>();
            for (int i = 0; i < deps.Length; i++)
            {
                Object o = deps[i];
                //不包含脚本对象
                //不包含LightingDataAsset对象
                if (o is MonoScript || o is LightingDataAsset)
                {
                    continue;
                }

                //不包含builtin对象
                string path = AssetDatabase.GetAssetPath(o);
                if (path.StartsWith("Resources"))
                {
                    continue;
                }

                depList.Add(o);
            }
            deps = depList.ToArray();
#else
            //提取 resource.builtin
            for (int i = 0; i < deps.Length; i++)
            {
                Object dep  = deps[i];
                string path = AssetDatabase.GetAssetPath(dep);
                if (path.StartsWith("Resources"))
                {
                    AssetTarget builtinAsset = AssetBundleUtils.Load(dep);
                    this.AddDependParent(builtinAsset);
                    builtinAsset.Analyze();
                }
            }
#endif

            //类似sql语句 查找筛选
            var res = from s in deps
                      let obj = AssetDatabase.GetAssetPath(s)
                                select obj;
            var paths = res.Distinct().ToArray();//	通过使用的默认相等比较器对值进行比较从序列返回非重复元素。

            for (int i = 0; i < paths.Length; i++)
            {
                if (File.Exists(paths[i]) == false)
                {
                    //Debug.Log("invalid:" + paths[i]);
                    continue;
                }
                FileInfo    fi     = new FileInfo(paths[i]);
                AssetTarget target = AssetBundleUtils.Load(fi);
                if (target == null)
                {
                    continue;
                }

                this.AddDependParent(target);

                target.Analyze();
            }
        }