using System.Collections; using System.Collections.Generic; using System; using UnityEngine; using System.IO; using vnxbqy.UI; using System.Threading; using System.Linq; 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(); //本地LogicBytes文件和 assetVersions 比较是否需要下载 static Dictionary localAssetVersions = new Dictionary(); static List priorDownLoadAssetVersions = new List(); static List unpriorDownLoadAssetVersions = new List(); public static bool checkAssetCompleted { get; private set; } private static string assetVerUrl; public static void Init() { } public static void OnDownLoadPriorBundle(DownloadTask task) { if (task.IsDone) { PriorBundleConfig.Init(true); GetAssetVersionFile(); } else { //一直尝试下载 task.BeginDownload(OnDownLoadPriorBundle); Debug.Log("OnDownLoadPriorBundle fail - before AssetVersion"); } } public static void GetAssetVersionFile() { checkAssetCompleted = false; Debug.LogFormat("开始获取资源版本文件:时间 {0}", DateTime.Now); var assetVersionUrl = StringUtility.Contact(VersionUtility.Instance.versionInfo.GetResourcesURL(VersionConfig.Get().branch), Language.fixPath, "/AssetsVersion.txt"); assetVerUrl = assetVersionUrl; Debug.Log("http地址:assetVersionUrl " + assetVersionUrl); HttpRequest.Instance.UnityWebRequestGet(assetVersionUrl, 5, OnGetAssetVersionFile); } private static void OnGetAssetVersionFile(bool _ok, string _result) { Debug.LogFormat("获取资源版本文件结果:时间 {0},结果 {1}, 文件大小 {2}", DateTime.Now, _ok, _result.Length); if (_ok) { assetVersionsLocalMd5 = FileExtersion.GetStringMD5Hash(_result); var assetVersions = UpdateAssetVersions(_result); BeginCheckAssets(); } else { Debug.Log("http 数据通讯: AssetVersionUtility:" + assetVerUrl + " result:" + _result); Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond * 3), GetAssetVersionFile); } } private static void BeginCheckAssets() { bool checkStream = true; #if UNITY_EDITOR if (InGameDownTestUtility.enable && !InGameDownTestUtility.isReadStreamingAssets) checkStream = false; #endif ThreadPool.QueueUserWorkItem( (object aaa) => { foreach (var assetVersion in assetVersions.Values) { bool checkReuslt; if (checkStream) { AssetVersion localAssetVersion = null; localAssetVersions.TryGetValue(assetVersion.relativePath, out localAssetVersion); checkReuslt = assetVersion.CheckLocalFileValid(localAssetVersion); } else { checkReuslt = assetVersion.CheckLocalFileValid(false); } if (!checkReuslt) { 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) { InitPackageVersionInfo(); 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; } static void InitPackageVersionInfo() { var text = Resources.Load("AssetsVersionCmp"); if (text != null) { var lines = text.text.Split(new string[] { FileExtersion.lineSplit }, StringSplitOptions.RemoveEmptyEntries); localAssetVersions.Clear(); for (int i = 0; i < lines.Length; i++) { var assetVersion = new AssetVersion(lines[i]); localAssetVersions[assetVersion.relativePath] = assetVersion; } } } public static AssetVersion GetAssetVersion(string assetKey) { if (assetVersions.ContainsKey(assetKey)) { return assetVersions[assetKey]; } else { return null; } } public static bool IsAssetValid(string assetKey) { assetKey = EncodeFileName(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) { if (item == 1) { continue; } var npcConfig = NPCConfig.Get(item); if (npcConfig != null) { var assetbundleName = StringUtility.Contact("prefab_race_", npcConfig.MODE.ToLower()); if (!IsAssetValid(StringUtility.Contact("gmodels/", assetbundleName))) { return false; } } } } } return true; } //将文件名倒序,加上_aop后缀 public static string EncodeFileName(string name) { return name; //name = name.Replace("\\", "/"); //int index = name.LastIndexOf("/"); //string headString; //if (index >= 0) //{ // int dotLastIndex = name.LastIndexOf("."); // if (dotLastIndex == -1) // { // headString = name.Substring(0, index); // name = name.Substring(index + 1); // return StringUtility.Contact(headString, "/", new string(name.Reverse().ToArray()), "_aop"); // } // else // { // headString = name.Substring(0, index); // var ext = name.Substring(dotLastIndex); // name = name.Substring(index + 1, dotLastIndex - index - 1); // return StringUtility.Contact(headString, "/", new string(name.Reverse().ToArray()), "_aop", ext); // } //} //else //{ // int dotLastIndex = name.LastIndexOf("."); // if (dotLastIndex == -1) // return StringUtility.Contact(new string(name.Reverse().ToArray()), "_aop"); // else // { // var ext = name.Substring(dotLastIndex); // name = name.Substring(0, dotLastIndex); // return StringUtility.Contact(new string(name.Reverse().ToArray()), "_aop", ext); // } //} } public static string DecodeFileName(string name) { return name; //name = name.Replace("\\", "/"); //int index = name.LastIndexOf("/"); //string headString; //if (index >= 0) //{ // int dotLastIndex = name.LastIndexOf("."); // if (dotLastIndex == -1) // { // headString = name.Substring(0, index); // name = name.Substring(index + 1); // return StringUtility.Contact(headString, "/", new string(name.Replace("_aop", "").Reverse().ToArray())); // } // else // { // headString = name.Substring(0, index); // var ext = name.Substring(dotLastIndex); // name = name.Substring(index + 1, dotLastIndex - index - 1); // return StringUtility.Contact(headString, "/", new string(name.Replace("_aop", "").Reverse().ToArray()), ext); // } //} //else //{ // int dotLastIndex = name.LastIndexOf("."); // if (dotLastIndex == -1) // return new string(name.Replace("_aop", "").Reverse().ToArray()); // else // { // var ext = name.Substring(dotLastIndex); // name = name.Substring(0, dotLastIndex); // return new string(name.Replace("_aop", "").Reverse().ToArray()) + ext; // } //} } public static string GetAssetFilePath(string _assetKey, bool reverse = true) { if (reverse) _assetKey = EncodeFileName(_assetKey); var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, _assetKey); if (!File.Exists(path)) { path = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, _assetKey); } return path; } public static string GetBuiltInAssetFilePath(string _assetKey, bool reverse = true) { if (reverse) _assetKey = EncodeFileName(_assetKey); var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, _assetKey); if (!File.Exists(path)) { path = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, _assetKey); } return path; } public static bool IsUnpriorAssetDownLoadOk() { if (VersionUtility.Instance.NeedDownAsset()) { return unPriorAssetDownLoadDone; } else { return true; } } }