using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Text; using System.IO; /// /// 版本管理 /// 其实说白了,就是下载所有需要更新资源滴... /// 暂时读取的txt /// /// public class AssetGame_VersionManager : AssetGame_Base { bool NeedRestart = false; public enum EUpdateState { /// /// 时刻准备着 /// None, /// /// 读取沙盒版本 /// LoadPersisVersionFile, /// /// 读取内存版本 /// LoadStreamVersionFile, /// /// 加载[解压]本地资源 /// LoadLocalRes, /// /// 加载服务器资源 /// LoadServerVersionFile, /// /// 服务器有需要下载的资源 /// NeedDownload, /// /// 下载并更新本地资源 /// LoadServerRes, /// ///搞定~ /// Over, /// /// 重新启动 /// Restart } EUpdateState _state = EUpdateState.None; #region Properties /// /// 本地资源列表 /// private Dictionary LocalResVersion; /// /// 服务器资源列表 /// public Dictionary ServerResVersion; /// /// 服务器资源大小的列表 /// public Dictionary ServerResSizeVersion; /// /// 本地只读资源列表 /// private Dictionary ReadResVersion; /// ///需要下载的资源 /// private List NeedDownFiles; /// /// 是否需要更新本地版本文件 /// private bool NeedUpdateLocalVersionFile = false; /// /// 服务器文件流内容 /// private string VersionFileContent = ""; /// /// 服务器发回的最新版本号 /// private string ServerVersion = ""; #endregion #region 供外部调用 /// /// 当前版本资源更新进度 /// public EUpdateState getState { get { return _state; } } /// /// 当前版本更新的状态 /// public EUpdateState setState { set { LogHelper.Log("当前执行状态【" + value + "】"); _state = value; } } public void SetAwake() { //初始化 LocalResVersion = new Dictionary(); ServerResVersion = new Dictionary(); ServerResSizeVersion = new Dictionary(); ReadResVersion = new Dictionary(); NeedDownFiles = new List(); } public void SetRun(string newVersion) { GetPersisVersion(); ServerVersion = newVersion; } #endregion /// /// 读沙盒版本 /// 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(); } } )); } /// /// 读取本地版本信息 /// 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("出大事了!!!!!!!!!没有读取到本地版本文件!"); } })); } /// /// 更新服务器端的版本信息 /// 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(); })); } /// /// 去下载服务器版本 /// 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; } } /// /// 开始下载更新. /// public void StartDownload() { setState = EUpdateState.LoadServerRes; //加载需要更新的资源 AssetGame_ResourceUpdate.Ins.SetMaxBundleNum = AssetGame_ResourceUpdate.Ins.GetNeedDownFilesCount; AssetGame_ResourceUpdate.Ins.DownLoadRes(ServerVersion); } /// /// 对比服务器和本地版本 /// 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(); } /// /// 更新本地的version配置 /// 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()); } /// /// 显示资源 /// /// //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; //} }