using System.Collections; using System.Collections.Generic; using System; using UnityEngine; using System.IO; using Snxxz.UI; using System.Threading; [XLua.LuaCallCSharp] public class AssetVersionUtility { public static string assetVersionsLocalMd5 { get { return LocalSave.GetString("AssetVersionsLocalMd5"); } set { LocalSave.SetString("AssetVersionsLocalMd5", value); } } static bool m_HasDownLoadFullAsset = LocalSave.GetBool("HasDownLoadFullAsset"); public static bool hasDownLoadFullAsset { get { return m_HasDownLoadFullAsset; } set { LocalSave.SetBool("HasDownLoadFullAsset", value); } } static bool m_PriorAssetDownLoadDone = false; public static bool priorAssetDownLoadDone { get { if (VersionUtility.Instance.NeedDownAsset()) { return m_PriorAssetDownLoadDone; } else { return true; } } } static bool m_UnPriorAssetDownLoadDone = false; public static bool unPriorAssetDownLoadDone { get { if (VersionUtility.Instance.NeedDownAsset()) { return m_UnPriorAssetDownLoadDone; } else { return true; } } } public static DateTime assetsBuildTime = DateTime.MinValue; static Dictionary assetVersions = new Dictionary(); static List priorDownLoadAssetVersions = new List(); static List unpriorDownLoadAssetVersions = new List(); public static bool checkAssetCompleted { get; private set; } public static void Init() { } public static void GetAssetVersionFile() { checkAssetCompleted = false; Debug.LogFormat("开始获取资源版本文件:时间 {0}", DateTime.Now); var assetVersionUrl = StringUtility.Contact(VersionUtility.Instance.versionInfo.GetResourcesURL(VersionConfig.Get().branch), "/", "AssetsVersion.txt"); HttpRequest.Instance.RequestHttpGet(assetVersionUrl, HttpRequest.defaultHttpContentType, 3, OnGetAssetVersionFile); } private static void OnGetAssetVersionFile(bool _ok, string _result) { Debug.LogFormat("获取资源版本文件结果:时间 {0},结果 {1}", DateTime.Now, _ok); if (_ok) { assetVersionsLocalMd5 = FileExtersion.GetStringMD5Hash(_result); var assetVersions = UpdateAssetVersions(_result); BeginCheckAssets(); } else { Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), GetAssetVersionFile); } } private static void BeginCheckAssets() { ThreadPool.QueueUserWorkItem( (object aaa) => { foreach (var assetVersion in assetVersions.Values) { if (!assetVersion.CheckLocalFileValid(false)) { if (assetVersion.IsPriorAsset()) { priorDownLoadAssetVersions.Add(assetVersion); } else { unpriorDownLoadAssetVersions.Add(assetVersion); } assetVersion.localValid = false; } else { assetVersion.localValid = true; } } m_PriorAssetDownLoadDone = priorDownLoadAssetVersions.Count <= 0; m_UnPriorAssetDownLoadDone = unpriorDownLoadAssetVersions.Count <= 0; checkAssetCompleted = true; } ); } public static void BeginDownLoadTask(bool _prior) { if (_prior) { m_PriorAssetDownLoadDone = false; DownLoadAndDiscompressTask.Instance.Prepare(priorDownLoadAssetVersions, () => { m_PriorAssetDownLoadDone = true; }); } else { m_UnPriorAssetDownLoadDone = false; InGameDownLoad.Instance.AssignTasks(unpriorDownLoadAssetVersions, () => { m_UnPriorAssetDownLoadDone = true; hasDownLoadFullAsset = true; }); } } public static Dictionary UpdateAssetVersions(string _assetVersionFile) { var lines = _assetVersionFile.Split(new string[] { FileExtersion.lineSplit }, StringSplitOptions.RemoveEmptyEntries); assetVersions.Clear(); for (int i = 0; i < lines.Length; i++) { var assetVersion = new AssetVersion(lines[i]); assetVersions[assetVersion.relativePath] = assetVersion; } return assetVersions; } public static AssetVersion GetAssetVersion(string assetKey) { if (assetVersions.ContainsKey(assetKey)) { return assetVersions[assetKey]; } else { return null; } } public static bool IsAssetValid(string assetKey) { if (assetVersions.ContainsKey(assetKey)) { return assetVersions[assetKey].localValid; } else { if (VersionUtility.Instance.NeedDownAsset()) { return false; } else { return true; } } } public static bool IsSceneAssetValid(int mapId, int lineId) { if (AssetSource.sceneFromEditor || mapId < 100) { return true; } var dataMapId = MapUtility.GetDataMapId(mapId); lineId = MapUtility.GetLineId(mapId, lineId); var mapResConfig = MapResourcesConfig.GetConfig(dataMapId, lineId); if (mapResConfig == null) { return false; } if (!IsAssetValid(StringUtility.Contact("maps/", mapResConfig.MapResources.ToLower()))) { return false; } if (dataMapId != 10010) { ActorShowConfig actorShowConfig = null; if (ActorShowConfig.GetActoreShowConfigByMapIdAndLineId(dataMapId, lineId, out actorShowConfig)) { var npcs = actorShowConfig.showNpcs; foreach (var item in npcs) { var npcConfig = NPCConfig.Get(item); if (npcConfig != null) { var assetbundleName = StringUtility.Contact("prefab_race_", npcConfig.MODE.ToLower()); if (!IsAssetValid(StringUtility.Contact("mob/", assetbundleName))) { return false; } } } } } return true; } public static string GetAssetFilePath(string _assetKey) { var path = string.Empty; if (assetVersions.ContainsKey(_assetKey)) { var assetVersion = assetVersions[_assetKey]; switch (assetVersion.fileLocation) { case AssetVersion.StorageLocation.StreamingAsset: path = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, _assetKey); break; case AssetVersion.StorageLocation.ExternalStore: path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, _assetKey); break; } } else { if (Application.platform == RuntimePlatform.Android) { path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, _assetKey); } else { path = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, _assetKey); } } return path; } public static string GetBuiltInAssetFilePath(string _assetKey) { var path = string.Empty; if (Application.platform == RuntimePlatform.Android) { path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, _assetKey); } else { if (SDKUtility.builtinAssetCopyFinished) { path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, _assetKey); } else { path = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, _assetKey); } } return path; } public static bool IsUnpriorAssetDownLoadOk() { if (VersionUtility.Instance.NeedDownAsset()) { return unPriorAssetDownLoadDone; } else { return true; } } }