mirror of https://github.com/tuyoogame/YooAsset
185 lines
5.7 KiB
C#
185 lines
5.7 KiB
C#
|
using System;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.UI;
|
|||
|
|
|||
|
public class PatchWindow : MonoBehaviour
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 对话框封装类
|
|||
|
/// </summary>
|
|||
|
private class MessageBox
|
|||
|
{
|
|||
|
private GameObject _cloneObject;
|
|||
|
private Text _content;
|
|||
|
private Button _btnOK;
|
|||
|
private System.Action _clickOK;
|
|||
|
|
|||
|
public bool ActiveSelf
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _cloneObject.activeSelf;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Create(GameObject cloneObject)
|
|||
|
{
|
|||
|
_cloneObject = cloneObject;
|
|||
|
_content = cloneObject.transform.Find("txt_content").GetComponent<Text>();
|
|||
|
_btnOK = cloneObject.transform.Find("btn_ok").GetComponent<Button>();
|
|||
|
_btnOK.onClick.AddListener(OnClickYes);
|
|||
|
}
|
|||
|
public void Show(string content, System.Action clickOK)
|
|||
|
{
|
|||
|
_content.text = content;
|
|||
|
_clickOK = clickOK;
|
|||
|
_cloneObject.SetActive(true);
|
|||
|
_cloneObject.transform.SetAsLastSibling();
|
|||
|
}
|
|||
|
public void Hide()
|
|||
|
{
|
|||
|
_content.text = string.Empty;
|
|||
|
_clickOK = null;
|
|||
|
_cloneObject.SetActive(false);
|
|||
|
}
|
|||
|
private void OnClickYes()
|
|||
|
{
|
|||
|
_clickOK?.Invoke();
|
|||
|
Hide();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private readonly EventGroup _eventGroup = new EventGroup();
|
|||
|
private readonly List<MessageBox> _msgBoxList = new List<MessageBox>();
|
|||
|
|
|||
|
// UGUI相关
|
|||
|
private GameObject _messageBoxObj;
|
|||
|
private Slider _slider;
|
|||
|
private Text _tips;
|
|||
|
|
|||
|
|
|||
|
void Awake()
|
|||
|
{
|
|||
|
_slider = transform.Find("UIWindow/Slider").GetComponent<Slider>();
|
|||
|
_tips = transform.Find("UIWindow/Slider/txt_tips").GetComponent<Text>();
|
|||
|
_tips.text = "Initializing the game world !";
|
|||
|
_messageBoxObj = transform.Find("UIWindow/MessgeBox").gameObject;
|
|||
|
_messageBoxObj.SetActive(false);
|
|||
|
|
|||
|
_eventGroup.AddListener<PatchEventMessageDefine.PatchStatesChange>(OnHandleEvent);
|
|||
|
_eventGroup.AddListener<PatchEventMessageDefine.FoundUpdateFiles>(OnHandleEvent);
|
|||
|
_eventGroup.AddListener<PatchEventMessageDefine.DownloadProgressUpdate>(OnHandleEvent);
|
|||
|
_eventGroup.AddListener<PatchEventMessageDefine.StaticVersionUpdateFailed>(OnHandleEvent);
|
|||
|
_eventGroup.AddListener<PatchEventMessageDefine.PatchManifestUpdateFailed>(OnHandleEvent);
|
|||
|
_eventGroup.AddListener<PatchEventMessageDefine.WebFileDownloadFailed>(OnHandleEvent);
|
|||
|
}
|
|||
|
void OnDestroy()
|
|||
|
{
|
|||
|
_eventGroup.RemoveAllListener();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 接收事件
|
|||
|
/// </summary>
|
|||
|
private void OnHandleEvent(IEventMessage msg)
|
|||
|
{
|
|||
|
if (msg is PatchEventMessageDefine.PatchStatesChange)
|
|||
|
{
|
|||
|
var message = msg as PatchEventMessageDefine.PatchStatesChange;
|
|||
|
if (message.CurrentStates == EPatchStates.UpdateStaticVersion)
|
|||
|
_tips.text = "Update static version.";
|
|||
|
else if (message.CurrentStates == EPatchStates.UpdateManifest)
|
|||
|
_tips.text = "Update patch manifest.";
|
|||
|
else if (message.CurrentStates == EPatchStates.CreateDownloader)
|
|||
|
_tips.text = "Check download contents.";
|
|||
|
else if (message.CurrentStates == EPatchStates.DownloadWebFiles)
|
|||
|
_tips.text = "Downloading patch files.";
|
|||
|
else if (message.CurrentStates == EPatchStates.PatchDone)
|
|||
|
_tips.text = "Welcome to game world !";
|
|||
|
else
|
|||
|
throw new NotImplementedException(message.CurrentStates.ToString());
|
|||
|
}
|
|||
|
else if (msg is PatchEventMessageDefine.FoundUpdateFiles)
|
|||
|
{
|
|||
|
var message = msg as PatchEventMessageDefine.FoundUpdateFiles;
|
|||
|
System.Action callback = () =>
|
|||
|
{
|
|||
|
PatchUpdater.HandleOperation(EPatchOperation.BeginDownloadWebFiles);
|
|||
|
};
|
|||
|
float sizeMB = message.TotalSizeBytes / 1048576f;
|
|||
|
sizeMB = Mathf.Clamp(sizeMB, 0.1f, float.MaxValue);
|
|||
|
string totalSizeMB = sizeMB.ToString("f1");
|
|||
|
ShowMessageBox($"Found update patch files, Total count {message.TotalCount} Total szie {totalSizeMB}MB", callback);
|
|||
|
}
|
|||
|
else if (msg is PatchEventMessageDefine.DownloadProgressUpdate)
|
|||
|
{
|
|||
|
var message = msg as PatchEventMessageDefine.DownloadProgressUpdate;
|
|||
|
_slider.value = (float)message.CurrentDownloadCount / message.TotalDownloadCount;
|
|||
|
string currentSizeMB = (message.CurrentDownloadSizeBytes / 1048576f).ToString("f1");
|
|||
|
string totalSizeMB = (message.TotalDownloadSizeBytes / 1048576f).ToString("f1");
|
|||
|
_tips.text = $"{message.CurrentDownloadCount}/{message.TotalDownloadCount} {currentSizeMB}MB/{totalSizeMB}MB";
|
|||
|
}
|
|||
|
else if (msg is PatchEventMessageDefine.StaticVersionUpdateFailed)
|
|||
|
{
|
|||
|
System.Action callback = () =>
|
|||
|
{
|
|||
|
PatchUpdater.HandleOperation(EPatchOperation.TryUpdateStaticVersion);
|
|||
|
};
|
|||
|
ShowMessageBox($"Failed to update static version, please check the network status.", callback);
|
|||
|
}
|
|||
|
else if (msg is PatchEventMessageDefine.PatchManifestUpdateFailed)
|
|||
|
{
|
|||
|
System.Action callback = () =>
|
|||
|
{
|
|||
|
PatchUpdater.HandleOperation(EPatchOperation.TryUpdatePatchManifest);
|
|||
|
};
|
|||
|
ShowMessageBox($"Failed to update patch manifest, please check the network status.", callback);
|
|||
|
}
|
|||
|
else if (msg is PatchEventMessageDefine.WebFileDownloadFailed)
|
|||
|
{
|
|||
|
var message = msg as PatchEventMessageDefine.WebFileDownloadFailed;
|
|||
|
System.Action callback = () =>
|
|||
|
{
|
|||
|
PatchUpdater.HandleOperation(EPatchOperation.TryDownloadWebFiles);
|
|||
|
};
|
|||
|
ShowMessageBox($"Failed to download file : {message.FileName}", callback);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
throw new System.NotImplementedException($"{msg.GetType()}");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 显示对话框
|
|||
|
/// </summary>
|
|||
|
private void ShowMessageBox(string content, System.Action ok)
|
|||
|
{
|
|||
|
// 尝试获取一个可用的对话框
|
|||
|
MessageBox msgBox = null;
|
|||
|
for (int i = 0; i < _msgBoxList.Count; i++)
|
|||
|
{
|
|||
|
var item = _msgBoxList[i];
|
|||
|
if (item.ActiveSelf == false)
|
|||
|
{
|
|||
|
msgBox = item;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 如果没有可用的对话框,则创建一个新的对话框
|
|||
|
if (msgBox == null)
|
|||
|
{
|
|||
|
msgBox = new MessageBox();
|
|||
|
var cloneObject = GameObject.Instantiate(_messageBoxObj, _messageBoxObj.transform.parent);
|
|||
|
msgBox.Create(cloneObject);
|
|||
|
_msgBoxList.Add(msgBox);
|
|||
|
}
|
|||
|
|
|||
|
// 显示对话框
|
|||
|
msgBox.Show(content, ok);
|
|||
|
}
|
|||
|
}
|