//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using GameFramework; using GameFramework.Download; using System; #if UNITY_5_4_OR_NEWER using UnityEngine.Networking; #else using UnityEngine.Experimental.Networking; #endif using Utility = GameFramework.Utility; namespace UnityGameFramework.Runtime { /// /// 使用 UnityWebRequest 实现的下载代理辅助器。 /// public partial class UnityWebRequestDownloadAgentHelper : DownloadAgentHelperBase, IDisposable { private const int CachedBytesLength = 0x1000; private readonly byte[] m_CachedBytes = new byte[CachedBytesLength]; private UnityWebRequest m_UnityWebRequest = null; private bool m_Disposed = false; private EventHandler m_DownloadAgentHelperUpdateBytesEventHandler = null; private EventHandler m_DownloadAgentHelperUpdateLengthEventHandler = null; private EventHandler m_DownloadAgentHelperCompleteEventHandler = null; private EventHandler m_DownloadAgentHelperErrorEventHandler = null; /// /// 下载代理辅助器更新数据流事件。 /// public override event EventHandler DownloadAgentHelperUpdateBytes { add { m_DownloadAgentHelperUpdateBytesEventHandler += value; } remove { m_DownloadAgentHelperUpdateBytesEventHandler -= value; } } /// /// 下载代理辅助器更新数据大小事件。 /// public override event EventHandler DownloadAgentHelperUpdateLength { add { m_DownloadAgentHelperUpdateLengthEventHandler += value; } remove { m_DownloadAgentHelperUpdateLengthEventHandler -= value; } } /// /// 下载代理辅助器完成事件。 /// public override event EventHandler DownloadAgentHelperComplete { add { m_DownloadAgentHelperCompleteEventHandler += value; } remove { m_DownloadAgentHelperCompleteEventHandler -= value; } } /// /// 下载代理辅助器错误事件。 /// public override event EventHandler DownloadAgentHelperError { add { m_DownloadAgentHelperErrorEventHandler += value; } remove { m_DownloadAgentHelperErrorEventHandler -= value; } } /// /// 通过下载代理辅助器下载指定地址的数据。 /// /// 下载地址。 /// 用户自定义数据。 public override void Download(string downloadUri, object userData) { if (m_DownloadAgentHelperUpdateBytesEventHandler == null || m_DownloadAgentHelperUpdateLengthEventHandler == null || m_DownloadAgentHelperCompleteEventHandler == null || m_DownloadAgentHelperErrorEventHandler == null) { Log.Fatal("Download agent helper handler is invalid."); return; } m_UnityWebRequest = new UnityWebRequest(downloadUri); m_UnityWebRequest.downloadHandler = new DownloadHandler(this); #if UNITY_2017_2_OR_NEWER m_UnityWebRequest.SendWebRequest(); #else m_UnityWebRequest.Send(); #endif } /// /// 通过下载代理辅助器下载指定地址的数据。 /// /// 下载地址。 /// 下载数据起始位置。 /// 用户自定义数据。 public override void Download(string downloadUri, long fromPosition, object userData) { if (m_DownloadAgentHelperUpdateBytesEventHandler == null || m_DownloadAgentHelperUpdateLengthEventHandler == null || m_DownloadAgentHelperCompleteEventHandler == null || m_DownloadAgentHelperErrorEventHandler == null) { Log.Fatal("Download agent helper handler is invalid."); return; } m_UnityWebRequest = new UnityWebRequest(downloadUri); m_UnityWebRequest.SetRequestHeader("Range", Utility.Text.Format("bytes={0}-", fromPosition.ToString())); m_UnityWebRequest.downloadHandler = new DownloadHandler(this); #if UNITY_2017_2_OR_NEWER m_UnityWebRequest.SendWebRequest(); #else m_UnityWebRequest.Send(); #endif } /// /// 通过下载代理辅助器下载指定地址的数据。 /// /// 下载地址。 /// 下载数据起始位置。 /// 下载数据结束位置。 /// 用户自定义数据。 public override void Download(string downloadUri, long fromPosition, long toPosition, object userData) { if (m_DownloadAgentHelperUpdateBytesEventHandler == null || m_DownloadAgentHelperUpdateLengthEventHandler == null || m_DownloadAgentHelperCompleteEventHandler == null || m_DownloadAgentHelperErrorEventHandler == null) { Log.Fatal("Download agent helper handler is invalid."); return; } m_UnityWebRequest = new UnityWebRequest(downloadUri); m_UnityWebRequest.SetRequestHeader("Range", Utility.Text.Format("bytes={0}-{1}", fromPosition.ToString(), toPosition.ToString())); m_UnityWebRequest.downloadHandler = new DownloadHandler(this); #if UNITY_2017_2_OR_NEWER m_UnityWebRequest.SendWebRequest(); #else m_UnityWebRequest.Send(); #endif } /// /// 重置下载代理辅助器。 /// public override void Reset() { if (m_UnityWebRequest != null) { m_UnityWebRequest.Abort(); m_UnityWebRequest.Dispose(); m_UnityWebRequest = null; } Array.Clear(m_CachedBytes, 0, CachedBytesLength); } /// /// 释放资源。 /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// /// 释放资源。 /// /// 释放资源标记。 protected virtual void Dispose(bool disposing) { if (m_Disposed) { return; } if (disposing) { if (m_UnityWebRequest != null) { m_UnityWebRequest.Dispose(); m_UnityWebRequest = null; } } m_Disposed = true; } private void Update() { if (m_UnityWebRequest == null) { return; } if (!m_UnityWebRequest.isDone) { return; } bool isError = false; #if UNITY_2020_2_OR_NEWER isError = m_UnityWebRequest.result != UnityWebRequest.Result.Success; #elif UNITY_2017_1_OR_NEWER isError = m_UnityWebRequest.isNetworkError || m_UnityWebRequest.isHttpError; #else isError = m_UnityWebRequest.isError; #endif if (isError) { DownloadAgentHelperErrorEventArgs downloadAgentHelperErrorEventArgs = DownloadAgentHelperErrorEventArgs.Create(m_UnityWebRequest.responseCode == RangeNotSatisfiableErrorCode, m_UnityWebRequest.error); m_DownloadAgentHelperErrorEventHandler(this, downloadAgentHelperErrorEventArgs); ReferencePool.Release(downloadAgentHelperErrorEventArgs); } else { DownloadAgentHelperCompleteEventArgs downloadAgentHelperCompleteEventArgs = DownloadAgentHelperCompleteEventArgs.Create((long)m_UnityWebRequest.downloadedBytes); m_DownloadAgentHelperCompleteEventHandler(this, downloadAgentHelperCompleteEventArgs); ReferencePool.Release(downloadAgentHelperCompleteEventArgs); } } } }