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<string, AssetVersion> assetVersions = new Dictionary<string, AssetVersion>();
|
//本地LogicBytes文件和 assetVersions 比较是否需要下载
|
static Dictionary<string, AssetVersion> localAssetVersions = new Dictionary<string, AssetVersion>();
|
static List<AssetVersion> priorDownLoadAssetVersions = new List<AssetVersion>();
|
static List<AssetVersion> unpriorDownLoadAssetVersions = new List<AssetVersion>();
|
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<string, AssetVersion> 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<TextAsset>("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;
|
}
|
}
|
|
|
}
|