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;
//}
}