YooAsset/Assets/Samples~/BasicSample/Script/Runtime/PatchUpdater/PatchWindow.cs

185 lines
5.7 KiB
C#
Raw Normal View History

2022-07-18 14:56:12 +08:00
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);
}
}