123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using System.Text;
- using System.IO;
- /// <summary>
- /// 版本管理
- /// 其实说白了,就是下载所有需要更新资源滴...
- /// 暂时读取的txt
- ///
- /// </summary>
- public class AssetGame_VersionManager : AssetGame_Base<AssetGame_VersionManager>
- {
- bool NeedRestart = false;
- public enum EUpdateState
- {
- /// <summary>
- /// 时刻准备着
- /// </summary>
- None,
- /// <summary>
- /// 读取沙盒版本
- /// </summary>
- LoadPersisVersionFile,
- /// <summary>
- /// 读取内存版本
- /// </summary>
- LoadStreamVersionFile,
- /// <summary>
- /// 加载[解压]本地资源
- /// </summary>
- LoadLocalRes,
- /// <summary>
- /// 加载服务器资源
- /// </summary>
- LoadServerVersionFile,
- /// <summary>
- /// 服务器有需要下载的资源
- /// </summary>
- NeedDownload,
- /// <summary>
- /// 下载并更新本地资源
- /// </summary>
- LoadServerRes,
- /// <summary>
- ///搞定~
- /// </summary>
- Over,
- /// <summary>
- /// 重新启动
- /// </summary>
- Restart
- }
- EUpdateState _state = EUpdateState.None;
- #region Properties
- /// <summary>
- /// 本地资源列表
- /// </summary>
- private Dictionary<string, string> LocalResVersion;
- /// <summary>
- /// 服务器资源列表
- /// </summary>
- public Dictionary<string, string> ServerResVersion;
- /// <summary>
- /// 服务器资源大小的列表
- /// </summary>
- public Dictionary<string, string> ServerResSizeVersion;
- /// <summary>
- /// 本地只读资源列表
- /// </summary>
- private Dictionary<string, string> ReadResVersion;
- /// <summary>
- ///需要下载的资源
- /// </summary>
- private List<string> NeedDownFiles;
- /// <summary>
- /// 是否需要更新本地版本文件
- /// </summary>
- private bool NeedUpdateLocalVersionFile = false;
- /// <summary>
- /// 服务器文件流内容
- /// </summary>
- private string VersionFileContent = "";
- /// <summary>
- /// 服务器发回的最新版本号
- /// </summary>
- private string ServerVersion = "";
- #endregion
- #region 供外部调用
- /// <summary>
- /// 当前版本资源更新进度
- /// </summary>
- public EUpdateState getState
- {
- get { return _state; }
- }
- /// <summary>
- /// 当前版本更新的状态
- /// </summary>
- public EUpdateState setState
- {
- set
- {
- LogHelper.Log("当前执行状态【" + value + "】");
- _state = value;
- }
- }
- public void SetAwake()
- {
- //初始化
- LocalResVersion = new Dictionary<string, string>();
- ServerResVersion = new Dictionary<string, string>();
- ServerResSizeVersion = new Dictionary<string, string>();
- ReadResVersion = new Dictionary<string, string>();
- NeedDownFiles = new List<string>();
- }
- public void SetRun(string newVersion)
- {
- GetPersisVersion();
- ServerVersion = newVersion;
- }
- #endregion
- /// <summary>
- /// 读沙盒版本
- /// </summary>
- void GetPersisVersion()
- {
- LogHelper.Log("```11````");
- setState = EUpdateState.LoadPersisVersionFile;
- /**
- * 首先读取沙盒中文件,如果没有,则表示第一次安装运行
- * Android之所以不支持C# IO流 方式读取StreamingAssets下的文件,是因为Android手机中
- * StreamingAssets下的文件都包含在压缩的.jar文件中(这基本上与标准的zip压缩文件的格
- * 式相同)。这意味着,如果你不使用Unity中的WWW类去检索文件,那么你需要使用额外的软
- * 件去查看.jar的存档并获取该文件。
- */
- AssetSystem_CoroutineProvider.Instance.StartCoroutine(AssetGame_ResourceUpdate.Ins.DownLoad(AssetConfig_GlobalSetting.strLocalSaveUrl + AssetConfig_GlobalSetting.strVersionFileName,
- delegate(WWW localVersion)
- {
- if (localVersion.text.Length != 0)
- {
- /**
- *
- */
- LogHelper.Log("沙盒中已经存在版本对比文件,将内容读取到列表");
- AssetGame_ResourceUpdate.Ins.ToParseVersionFileXml(localVersion.text, LocalResVersion, "LocalVersion");
- SetServerVersion();
- }
- else
- {
- LogHelper.Log("沙盒没有版本文件");
- GetLocalVersion();
- }
- }
- ));
- }
- /// <summary>
- /// 读取本地版本信息
- /// </summary>
- void GetLocalVersion()
- {
- setState = EUpdateState.LoadStreamVersionFile;
- LogHelper.Log("读取本地版本信息:" + AssetConfig_GlobalSetting.strLocalReadUrl + AssetConfig_GlobalSetting.strVersionFileName);
- AssetSystem_CoroutineProvider.Instance.StartCoroutine(AssetGame_ResourceUpdate.Ins.DownLoad(AssetConfig_GlobalSetting.strLocalReadUrl + AssetConfig_GlobalSetting.strVersionFileName,
- delegate (WWW orgVersion)
- {
- if (orgVersion.text.Length > 0)
- {
- LogHelper.Log("复制本地的version到沙盒中:" + orgVersion.text);
- AssetGame_ResourceUpdate.Ins.ToParseVersionFileXml(orgVersion.text, ReadResVersion, "orgVersion");
- LogHelper.Log("重写文件:" + AssetConfig_GlobalSetting.strVersionFileName);
- AssetSystem_AndroidFileHelper.Instance.ReWriteFileByString(AssetConfig_GlobalSetting.strVersionFileName, orgVersion.text);
- AssetGame_ResourceUpdate.Ins.ToParseVersionFileXml(orgVersion.text, LocalResVersion, "LocalVersion");
- LogHelper.Log("复制完毕!");
- setState = EUpdateState.LoadLocalRes;
- SetServerVersion();
- }
- else
- {
- SetServerVersion();
- LogHelper.Log("出大事了!!!!!!!!!没有读取到本地版本文件!");
- }
- }));
- }
- /// <summary>
- /// 更新服务器端的版本信息
- /// </summary>
- public void SetServerVersion()
- {
- setState = EUpdateState.LoadServerVersionFile;
- string cdnpath = AssetConfig_GlobalSetting.strServerUrl + ServerVersion + "/";
- string cdnfile = GlobalConfig.ClientVersion + "---" + ServerVersion + ".txt";
- LogHelper.Log(cdnpath + "" + cdnfile);
- AssetGame_ResourceUpdate.Ins.SetProgress(0);
- AssetSystem_CoroutineProvider.Instance.StartCoroutine(AssetGame_ResourceUpdate.Ins.DownLoad(cdnpath + cdnfile, delegate (WWW serverVersion)
- {
- LogHelper.Log("加载网络CDN资源:" + cdnpath + cdnfile);
- if (serverVersion.error != null)
- {
- LogHelper.Log(serverVersion.error);
- return;
- // LogHelper.Log("当前网络不可用,请检查后重试 服务器正在维护中,请稍后重试");
- }
- //保存服务端version
- AssetGame_ResourceUpdate.Ins.ToParseVersionFileXml(serverVersion.text, ServerResVersion, "ServerVersion");
- AssetGame_ResourceUpdate.Ins.ToParseVersionFileSizeXml(serverVersion.text, ServerResSizeVersion, "ServerResSizeVersion");
- VersionFileContent = serverVersion.text;
- ////计算出需要重新加载的资源
- GetCompareVersion();
- }));
- }
- /// <summary>
- /// 去下载服务器版本
- /// </summary>
- void GetServerRes()
- {
- //本次有更新,同时更新本地的version.txt
- NeedUpdateLocalVersionFile = AssetGame_ResourceUpdate.Ins.GetNeedDownFilesCount > 0;
- if (!NeedUpdateLocalVersionFile)
- {
- if (NeedRestart)
- {
- LogHelper.Log("已是最新版本!重启游戏!");
- AssetGame_ResourceUpdate.Ins.DownLoadRes(ServerVersion);
- PlayerPrefs.Save();
- GlobalConfig.ClientVersion = ServerVersion;
- setState = EUpdateState.Restart;
- }
- else
- {
- LogHelper.Log("已是最新版本!无需更新!!!!~~~~~~~~~~~~~~~");
- PlayerPrefs.SetString("Version", ServerVersion);
- PlayerPrefs.Save();
- GlobalConfig.ClientVersion = ServerVersion;
- setState = EUpdateState.Over;
- }
- }
- else
- {
- GlobalConfig.ClientVersion = ServerVersion;
- setState = EUpdateState.NeedDownload;
- AssetGame_ResourceUpdate.Ins.SetMaxBundleNum = AssetGame_ResourceUpdate.Ins.GetNeedDownFilesCount;
- AssetGame_ResourceUpdate.Ins.DownLoadRes(ServerVersion);
- return;
-
- }
- }
- /// <summary>
- /// 开始下载更新.
- /// </summary>
- public void StartDownload()
- {
- setState = EUpdateState.LoadServerRes;
- //加载需要更新的资源
- AssetGame_ResourceUpdate.Ins.SetMaxBundleNum = AssetGame_ResourceUpdate.Ins.GetNeedDownFilesCount;
- AssetGame_ResourceUpdate.Ins.DownLoadRes(ServerVersion);
- }
- /// <summary>
- /// 对比服务器和本地版本
- /// </summary>
- void GetCompareVersion()
- {
- int num = 0;
- foreach (var version in ServerResVersion)
- {
- string fileName = version.Key;
- string serverMd5 = version.Value;
-
- //新增的资源
- if (!LocalResVersion.ContainsKey(fileName))
- {
- if (fileName.Equals("Assembly-CSharp.dll"))
- {
- NeedRestart = true;
- }
- LogHelper.Log("新增资源" + fileName);
- string serverResSize;
- ServerResSizeVersion.TryGetValue(fileName, out serverResSize);
- num += int.Parse(serverResSize);
- // LogHelper.Log("数据量大小:" + num);
- AssetGame_ResourceUpdate.Ins.SetMaxBundleSize = num;
- AssetGame_ResourceUpdate.Ins.AddLoadRes(fileName);
- }
- else
- {
- //需要替换的资源
- string localMd5;
- LocalResVersion.TryGetValue(fileName, out localMd5);
-
- if (serverMd5!=localMd5)
- {
- if (fileName.Equals("Assembly-CSharp.dll"))
- {
- NeedRestart = true;
- }
- LogHelper.Log("localMd5=" + localMd5 + "/serverMd5=" + serverMd5);
- LogHelper.Log("需要下载更新的资源=" + fileName);
- string serverResSize;
- ServerResSizeVersion.TryGetValue(fileName, out serverResSize);
- num +=int .Parse ( serverResSize);
- // LogHelper.Log ("数据量大小:" + num);
- AssetGame_ResourceUpdate.Ins.SetMaxBundleSize = num;
- // LogHelper.Log("数据量大小1111:" +AssetGame_ResourceUpdate.Ins.GetMaxBundleSize );
- AssetGame_ResourceUpdate.Ins.AddLoadRes(fileName);
- }
- }
- }
-
- GetServerRes();
- }
- /// <summary>
- /// 更新本地的version配置
- /// </summary>
- public void SetUpdateLocalVersionFile()
- {
- //AssetSystem_AndroidFileHelper.Ins.ReWriteFileByString(
- // AssetConfig_GlobalSetting.strVersionFileName,
- // VersionFileContent);
- if (NeedRestart)
- {
- LogHelper.Log("已更新到最新版本!重启游戏!");
- setState = EUpdateState.Restart;
- }
- else
- {
- PlayerPrefs.SetString("Version", ServerVersion);
- PlayerPrefs.Save();
- LogHelper.Log("更新完毕");
- setState = EUpdateState.Over;
- }
- // //加载显示对象
- //StartCoroutine(Show());
- }
- /// <summary>
- /// 显示资源
- /// </summary>
- /// <returns></returns>
- //private IEnumerator Show()
- //{
- // LogHelper.Log(AssetConfig_GlobalSetting.LOCAL_RES_URL + "Assets.Prefab.UI.TestAWindow.assetbundle");
- // WWW asset = new WWW(AssetConfig_GlobalSetting.LOCAL_RES_URL + "Assets.Prefab.UI.TestAWindow.assetbundle");
- // yield return asset;
- // AssetBundle bundle = asset.assetBundle;
- // Object obj1 = bundle.LoadAsset("Assets.Prefab.UI.TestAWindow");
- // yield return Instantiate(obj1);
- // bundle.Unload(false);
- // yield return null;
- //}
- }
|