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.IndexOf('.'); 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("mob/")) { 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 { return AssetCategory.Other; } } public bool CheckLocalFileValid(bool _completeFile) { if (_completeFile) { var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); var fileInfo = new FileInfo(path); return fileInfo.Exists && fileInfo.Length == size && md5 == FileExtersion.GetMD5HashFromFile(path); } 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 IsPriorAsset() { if (VersionConfig.Get().partAssetPackage) { //如果这台机器曾经完整的下载过所有资源,那么就不再使用分包下载策略,在资源热更新的时候这种情况会触发。 if (AssetVersionUtility.hasDownLoadFullAsset) { return true; } else { var category = GetAssetCategory(); var prior = PriorBundleConfig.GetAssetPrior(category, m_FileName); return prior <= 1; } } else { return true; } } public enum StorageLocation { StreamingAsset, ExternalStore } public enum AssetCategory { UI, Audio, Mob, Scene, Effect, Config, Shader, Dll, Other, } }