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; } } }
/// <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(); } }