You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
381 lines
13 KiB
381 lines
13 KiB
4 years ago
|
using AX.MessageSystem;
|
||
|
using AX.NetworkSystem;
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.IO;
|
||
|
using System.Xml;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.SceneManagement;
|
||
|
|
||
|
public class UpdateManager : MonoBehaviour
|
||
|
{
|
||
|
private static UpdateManager instance;
|
||
|
public static UpdateManager Instance
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return instance;
|
||
|
}
|
||
|
}
|
||
|
public DisasterInfo selectedMsg; //被选中的灾情信息
|
||
|
|
||
|
private string serverDirectoryPath;//服务端文件存储文件夹
|
||
|
private string localDirectoryPath;//本地文件存储文件夹
|
||
|
//private string tempDirectoryPath; //下载下来的配置文件暂存文件夹//单机版注释掉
|
||
|
private string serverFileXml;//服务端文件版本配置
|
||
|
private string localTempXml; //本地临时配置文件路径
|
||
|
private string localFileXml;//本地文件版本配置
|
||
|
private List<string> fileList = new List<string>(); //需要更新的文件列表
|
||
|
private List<string> delList = new List<string>(); //需要删除的文件列表
|
||
|
private int updateCount;
|
||
|
private bool[] completedList;
|
||
|
private float[] progressList;
|
||
|
|
||
|
public bool isEdit = false;
|
||
|
public UpdateState state;
|
||
|
|
||
|
private void Awake()
|
||
|
{
|
||
|
instance = this;
|
||
|
selectedMsg = new DisasterInfo();
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 进入编辑模式
|
||
|
/// </summary>
|
||
|
public void Edit()
|
||
|
{
|
||
|
state = UpdateState.Edit;
|
||
|
DisasterManager.disaster = selectedMsg;
|
||
|
initPath();
|
||
|
DisasterManager.editorRight = true;
|
||
|
// downLoadFileVersion();//单机版注释
|
||
|
versionUpdateOnCompleted();//联机版取消注释
|
||
|
}
|
||
|
public void Edit(DisasterInfo info)
|
||
|
{
|
||
|
selectedMsg = info;
|
||
|
DisasterManager.disaster = selectedMsg;
|
||
|
|
||
|
state = UpdateState.Edit;
|
||
|
initPath();
|
||
|
//downLoadFileVersion();//单机版注释
|
||
|
versionUpdateOnCompleted();
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 进入查看模式 //单机版注释
|
||
|
/// </summary>
|
||
|
public void View()
|
||
|
{
|
||
|
state = UpdateState.View;
|
||
|
DisasterManager.disaster = selectedMsg;
|
||
|
DisasterManager.editorRight = false;
|
||
|
initPath();
|
||
|
//downLoadFileVersion();//单机版注释
|
||
|
versionUpdateOnCompleted();
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 进入主场景之前先更新 //单机版注释
|
||
|
/// </summary>
|
||
|
//private void UpdateBeforeContinue()
|
||
|
//{
|
||
|
// foreach(string key in delList)
|
||
|
// {
|
||
|
// File.Delete(localDirectoryPath + key);
|
||
|
// }
|
||
|
// progressList = new float[fileList.Count];
|
||
|
// completedList = new bool[fileList.Count];
|
||
|
// UpdateResources();
|
||
|
//}
|
||
|
/// <summary>
|
||
|
/// 不更新直接进入主场景
|
||
|
/// </summary>
|
||
|
private void ContinueWithoutUpdate()
|
||
|
{
|
||
|
if (File.Exists(localTempXml))
|
||
|
{
|
||
|
//删除临时配置文件
|
||
|
File.Delete(localTempXml);
|
||
|
}
|
||
|
DisasterManager.updateFlag = true;
|
||
|
switch (state)
|
||
|
{
|
||
|
case UpdateState.None:
|
||
|
break;
|
||
|
case UpdateState.Edit:
|
||
|
//编辑
|
||
|
DisasterManager.model = PlayModel.editor;
|
||
|
break;
|
||
|
case UpdateState.View:
|
||
|
//查看
|
||
|
DisasterManager.model = PlayModel.view;
|
||
|
break;
|
||
|
case UpdateState.MainSceneUpdate:
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
//进入主场景
|
||
|
SceneManager.LoadScene("MainScene_New");
|
||
|
}
|
||
|
//单机版注释掉
|
||
|
//public void MainSceneUpdateDisaster()
|
||
|
//{
|
||
|
// state = UpdateState.MainSceneUpdate;
|
||
|
// //先更新
|
||
|
// initPath();
|
||
|
// downLoadFileVersion();
|
||
|
//}
|
||
|
/// <summary>
|
||
|
/// 文件路径初始化
|
||
|
/// </summary>
|
||
|
private void initPath()
|
||
|
{
|
||
|
fileList = new List<string>();
|
||
|
serverDirectoryPath = selectedMsg.Id.ToString() + "/File/"; //服务器相对路径
|
||
|
localDirectoryPath = Application.dataPath + "/Data/" + selectedMsg.Id.ToString() + "/File/"; //本地路径
|
||
|
//tempDirectoryPath = Application.dataPath + "/Temp/" + selectedMsg.Id.ToString() + "/"; //本地临时路径 //单机版注释
|
||
|
//如果本地没有该灾情的文件夹,先创建
|
||
|
if (!Directory.Exists(localDirectoryPath))
|
||
|
{
|
||
|
Directory.CreateDirectory(localDirectoryPath);
|
||
|
}
|
||
|
//如果本地没有临时路径,先创建 //单机版注释
|
||
|
//if (!Directory.Exists(tempDirectoryPath))
|
||
|
//{
|
||
|
// Directory.CreateDirectory(tempDirectoryPath);
|
||
|
//}
|
||
|
|
||
|
serverFileXml = selectedMsg.Id.ToString() + "/" + selectedMsg.Id.ToString() + ".xml"; //服务器配置文件
|
||
|
localTempXml = Application.dataPath + "/Temp/" + selectedMsg.Id.ToString() + ".xml"; //本地临时配置文件
|
||
|
localFileXml = Application.dataPath + "/Data/" + selectedMsg.Id.ToString() + "/" + selectedMsg.Id.ToString() + ".xml"; //本地配置文件
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 下载最新的文件配置文档 //单机版注释
|
||
|
/// </summary>
|
||
|
//private void downLoadFileVersion()
|
||
|
//{
|
||
|
// NetworkManager.Default.DownloadFileAsync(localTempXml, serverFileXml , null, OnDownloadProgress, OnFileVersionCompleted);
|
||
|
//}
|
||
|
|
||
|
private void OnDownloadProgress(string arg1, string arg2, float progress)
|
||
|
{
|
||
|
if (progress < 100)
|
||
|
{
|
||
|
ResourceLoadWindow.Instance.LoadTextHintWindow("正在更新...", 0.5f);
|
||
|
}
|
||
|
}
|
||
|
//单机版注释掉该方法
|
||
|
//private void OnFileVersionCompleted(string localTempXml, string serverFileXml)
|
||
|
//{
|
||
|
// if (!File.Exists(localFileXml))
|
||
|
// {
|
||
|
// CreateMD5Tool.Instance.CreateManifestXml(localDirectoryPath, localFileXml);
|
||
|
// }
|
||
|
// //获取本地的HashID
|
||
|
// Dictionary<string, string> localHashID = getMainFileVersion(localFileXml);
|
||
|
// //获取最新的HashID
|
||
|
// Dictionary<string, string> serverHashID = getMainFileVersion(localTempXml);
|
||
|
|
||
|
// foreach (string key in serverHashID.Keys)
|
||
|
// {
|
||
|
// //1、先判断本地资源列表是否存在,若不存在则属于新资源
|
||
|
// if (!localHashID.ContainsKey(key))
|
||
|
// {
|
||
|
// fileList.Add(key);
|
||
|
// }
|
||
|
// else
|
||
|
// {
|
||
|
// //2、再判断HashID是否相等,若不等则属于新资源
|
||
|
// string hash = serverHashID[key];
|
||
|
// if (localHashID[key] != serverHashID[key])
|
||
|
// {
|
||
|
// fileList.Add(key);
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
// foreach(string key in localHashID.Keys)
|
||
|
// {
|
||
|
// //如果本地有但服务端没有,则删除该资源
|
||
|
// if (!serverHashID.ContainsKey(key))
|
||
|
// {
|
||
|
// //File.Delete(localDirectoryPath + key);
|
||
|
// delList.Add(key);
|
||
|
// }
|
||
|
// }
|
||
|
// if (fileList.Count > 0 || delList.Count > 0)
|
||
|
// {
|
||
|
// switch (state)
|
||
|
// {
|
||
|
// case UpdateState.None:
|
||
|
// break;
|
||
|
// case UpdateState.Edit:
|
||
|
// ResourceLoadWindow.Instance.LoadUpdateTipWindow("本地与服务端内容不一致,是否更新?", UpdateBeforeContinue, ContinueWithoutUpdate);
|
||
|
// break;
|
||
|
// case UpdateState.View:
|
||
|
// ResourceLoadWindow.Instance.LoadUpdateTipWindow("本地与服务端内容不一致,是否更新?", UpdateBeforeContinue, ContinueWithoutUpdate);
|
||
|
// break;
|
||
|
// case UpdateState.MainSceneUpdate:
|
||
|
// UpdateBeforeContinue();
|
||
|
// break;
|
||
|
// default:
|
||
|
// break;
|
||
|
// }
|
||
|
// }
|
||
|
// else
|
||
|
// {
|
||
|
// //将本地临时配置文件替换原有配置文件
|
||
|
// FileMove(localTempXml, localFileXml);
|
||
|
// //更新完成
|
||
|
// versionUpdateOnCompleted();
|
||
|
// }
|
||
|
//}
|
||
|
/// <summary>
|
||
|
/// 更新完成
|
||
|
/// </summary>
|
||
|
private void versionUpdateOnCompleted()
|
||
|
{
|
||
|
switch (state)
|
||
|
{
|
||
|
case UpdateState.None:
|
||
|
break;
|
||
|
case UpdateState.Edit:
|
||
|
DisasterManager.model = PlayModel.editor;
|
||
|
SceneManager.LoadScene("MainScene_New");
|
||
|
break;
|
||
|
case UpdateState.View:
|
||
|
DisasterManager.model = PlayModel.view;
|
||
|
SceneManager.LoadScene("MainScene_New");
|
||
|
break;
|
||
|
case UpdateState.MainSceneUpdate:
|
||
|
Debug.Log("灾情更新完成");
|
||
|
// MessageDispatcher.SendMessage("DisasterUpdateCompelete"); //单机版注释
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 文件下载更新 单机版注释
|
||
|
/// </summary>
|
||
|
//private void UpdateResources()
|
||
|
//{
|
||
|
// updateCount = 0;
|
||
|
// for (int i = 0; i < fileList.Count; i++)
|
||
|
// {
|
||
|
// // Debug.Log("#########################第" + i + "个文件开始下载");
|
||
|
|
||
|
// var fullPath = tempDirectoryPath + fileList[i]; //本地临时路径
|
||
|
// var filePath = serverDirectoryPath + fileList[i]; //服务器相对路径
|
||
|
// checkDirectory(fullPath);
|
||
|
// NetworkManager.Default.DownloadFileAsync(fullPath, filePath, null, OnDownloadProgress, OnCompleted);
|
||
|
// }
|
||
|
//}
|
||
|
private void checkDirectory(string path)
|
||
|
{
|
||
|
string directoryName = Path.GetDirectoryName(path);
|
||
|
if (!Directory.Exists(directoryName) && directoryName != "")
|
||
|
{
|
||
|
Directory.CreateDirectory(directoryName);
|
||
|
}
|
||
|
}
|
||
|
//单机版注释
|
||
|
//private void OnCompleted(string fullname,string filename)
|
||
|
//{
|
||
|
// updateCount++;
|
||
|
// var fileName = filename.Replace(serverDirectoryPath, string.Empty);
|
||
|
// var targetFile = localDirectoryPath + fileName;
|
||
|
// //将临时文件替换原有文件
|
||
|
// FileMove(fullname, targetFile);
|
||
|
|
||
|
// int index = fileList.IndexOf(fileName);
|
||
|
// completedList[index] = true;
|
||
|
// Debug.Log("*************************第" + index + "个文件下载完成");
|
||
|
|
||
|
// //所有文件更新完成
|
||
|
// if (updateCount == fileList.Count)
|
||
|
// {
|
||
|
// Directory.Delete(tempDirectoryPath, true);
|
||
|
// //将本地临时配置文件替换原有配置文件
|
||
|
// FileMove(localTempXml, localFileXml);
|
||
|
// versionUpdateOnCompleted();
|
||
|
// }
|
||
|
//}
|
||
|
/// <summary>
|
||
|
/// 文件移动
|
||
|
/// </summary>
|
||
|
/// <param name="sourceFile"></param>
|
||
|
/// <param name="targetFile"></param>
|
||
|
private void FileMove(string sourceFile, string targetFile)
|
||
|
{
|
||
|
if (File.Exists(targetFile))
|
||
|
{
|
||
|
File.Delete(targetFile);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
string directoryName = Path.GetDirectoryName(targetFile);
|
||
|
if (!Directory.Exists(directoryName) && directoryName != "")
|
||
|
{
|
||
|
Directory.CreateDirectory(directoryName);
|
||
|
}
|
||
|
}
|
||
|
try
|
||
|
{
|
||
|
File.Move(sourceFile, targetFile);
|
||
|
}
|
||
|
catch (Exception exception)
|
||
|
{
|
||
|
Debug.LogError(exception.Message);
|
||
|
}
|
||
|
}
|
||
|
private void createLocalFileXml(string path)
|
||
|
{
|
||
|
XmlDocument document = new XmlDocument();
|
||
|
XmlDeclaration xmldecl = document.CreateXmlDeclaration("1.0", "UTF-8", "yes");
|
||
|
document.AppendChild(xmldecl);
|
||
|
XmlElement newChild = document.CreateElement("Files");
|
||
|
document.AppendChild(newChild);
|
||
|
document.Save(path);
|
||
|
newChild = null;
|
||
|
document = null;
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 获取xml文件版本信息
|
||
|
/// </summary>
|
||
|
/// <param name="path"></param>
|
||
|
/// <returns></returns>
|
||
|
private Dictionary<string, string> getMainFileVersion(string path)
|
||
|
{
|
||
|
Dictionary<string, string> fileHashID = new Dictionary<string, string>();
|
||
|
XmlDocument document = new XmlDocument();
|
||
|
document.Load(path);
|
||
|
XmlNodeList nodeList = document.SelectSingleNode("Files").ChildNodes;
|
||
|
foreach (XmlElement fileNode in nodeList)
|
||
|
{
|
||
|
var fileName = fileNode.GetAttribute("FileName");
|
||
|
var fileHash = fileNode.GetAttribute("Hash");
|
||
|
fileHashID.Add(fileName, fileHash);
|
||
|
}
|
||
|
document = null;
|
||
|
return fileHashID;
|
||
|
}
|
||
|
}
|
||
|
public enum UpdateState
|
||
|
{
|
||
|
None,
|
||
|
/// <summary>
|
||
|
/// 编辑灾情
|
||
|
/// </summary>
|
||
|
Edit,
|
||
|
/// <summary>
|
||
|
/// 查看灾情
|
||
|
/// </summary>
|
||
|
View,
|
||
|
/// <summary>
|
||
|
/// 主场景内更新灾情
|
||
|
/// </summary>
|
||
|
MainSceneUpdate
|
||
|
}
|