using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class AssetVersion { string m_RelativePath = string.Empty; public string relativePath { get { return m_RelativePath; } } string m_FileName; public string fileName { get { return m_FileName; } } string m_Extersion = string.Empty; public string extersion { get { return m_Extersion; } } string m_Md5 = string.Empty; public string md5 { get { return m_Md5; } } int m_Size = 0; public int size { get { return m_Size; } } //字节 StorageLocation m_FileLocation = StorageLocation.ExternalStore; public StorageLocation fileLocation { get { return m_FileLocation; } } bool m_LocalValid = false; public bool localValid { get { return m_LocalValid; } set { m_LocalValid = value; } } public AssetVersion(string _versionString) { var strings = _versionString.Split('\t'); m_RelativePath = strings[0]; m_Extersion = strings[1]; int.TryParse(strings[2], out m_Size); m_Md5 = strings[3]; var paths = m_RelativePath.Split('/'); var lastPath = paths[paths.Length - 1]; var index = lastPath.LastIndexOf('.'); if (index != -1) { m_FileName = lastPath.Substring(0, index); } else { m_FileName = lastPath; } } public AssetCategory GetAssetCategory() { if (extersion == ".dll") return AssetCategory.Dll; else if (m_RelativePath.StartsWith("ui/")) return AssetCategory.UI; else if (m_RelativePath.StartsWith("audio/")) return AssetCategory.Audio; else if (m_RelativePath.StartsWith("gmodels/")) return AssetCategory.Mob; else if (m_RelativePath.StartsWith("maps/")) return AssetCategory.Scene; else if (m_RelativePath.StartsWith("effect/")) return AssetCategory.Effect; else if (m_RelativePath.StartsWith("config/")) return AssetCategory.Config; else if (m_RelativePath.StartsWith("graphic/")) return AssetCategory.Shader; else if (m_RelativePath.StartsWith("video/")) return AssetCategory.Video; else return AssetCategory.Other; } public bool CheckLocalFileValid(bool _completeFile) { if (_completeFile) { var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); var fileInfo = new FileInfo(path); if (!fileInfo.Exists) { Debug.LogFormat("文件不存在 {0}", path); return false; } if (fileInfo.Length != size) { Debug.LogFormat("{0}文件大小不对{1}-{2}", path, size, fileInfo.Length); return false; } var fileMD5 = FileExtersion.GetMD5HashFromFile(path); if (fileMD5 != md5) { Debug.LogFormat("{0}文件md5不对{1}-{2}", path, md5, fileMD5); return false; } return true; } else { if (extersion == ".manifest" || extersion == ".bytes" || extersion == ".txt" || extersion == ".dll") { var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); var fileInfo = new FileInfo(path); if (!fileInfo.Exists || fileInfo.Length != size || md5 != FileExtersion.GetMD5HashFromFile(path)) { return false; } } else if (string.IsNullOrEmpty(extersion) || extersion.Length == 0) { var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); var fileInfo = new FileInfo(path); var manifestAssetVersion = AssetVersionUtility.GetAssetVersion(StringUtility.Contact(m_RelativePath, ".manifest")); if (!fileInfo.Exists || fileInfo.Length != size || manifestAssetVersion == null || !manifestAssetVersion.CheckLocalFileValid(false)) { return false; } } else { var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); var fileInfo = new FileInfo(path); if (!fileInfo.Exists || fileInfo.Length != size) { return false; } } } return true; } // 检查外部存储文件是否存在 // 不存在则读取随包文件进行比较 // 存在则比较 public bool CheckLocalFileValid(AssetVersion otherAssetInfo) { string path = string.Concat(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); if (!File.Exists(path) && !m_RelativePath.Contains(".txt")) { //Debug.LogFormat("转查StreamingAssetPath - 文件不存在 {0} ", path); if (otherAssetInfo == null || string.IsNullOrEmpty(otherAssetInfo.relativePath)) return false; if (otherAssetInfo.size != size) { Debug.LogFormat("StreamingAssetPath 文件大小不对{0}-{1}", size, otherAssetInfo.size); return false; } if (otherAssetInfo.md5 != md5) { Debug.LogFormat("StreamingAssetPath 文件md5不对{0}-{1}", md5, otherAssetInfo.md5); return false; } return true; } return CheckLocalFileValid(false); } public bool IsPriorAsset() { if (VersionConfig.Get().partAssetPackage) { //如果这台机器曾经完整的下载过所有资源,那么就不再使用分包下载策略,在资源热更新的时候这种情况会触发。 if (AssetVersionUtility.hasDownLoadFullAsset) { return true; } else { var category = GetAssetCategory(); var prior = PriorBundleConfig.GetAssetPrior(category, AssetVersionUtility.DecodeFileName(m_FileName)); return prior <= 1; } } else { return true; } } public enum StorageLocation { StreamingAsset, ExternalStore } public enum AssetCategory { UI, Audio, Mob, Scene, Effect, Config, Shader, Dll, Video, Other, Patch,//补丁 Logic,//热更逻辑代码 } }