using System; using UnityEngine.Networking; namespace ET { public class UnityWebRequestUpdateSystem : UpdateSystem { public override void Update(UnityWebRequestAsync self) { self.Update(); } } public class UnityWebRequestAsync : Entity { public class AcceptAllCertificate: CertificateHandler { protected override bool ValidateCertificate(byte[] certificateData) { return true; } } public static AcceptAllCertificate certificateHandler = new AcceptAllCertificate(); public UnityWebRequest Request; public bool isCancel; public ETTaskCompletionSource tcs; public override void Dispose() { if (this.IsDisposed) { return; } base.Dispose(); this.Request?.Dispose(); this.Request = null; this.isCancel = false; } public float Progress { get { if (this.Request == null) { return 0; } return this.Request.downloadProgress; } } public ulong ByteDownloaded { get { if (this.Request == null) { return 0; } return this.Request.downloadedBytes; } } public void Update() { if (this.isCancel) { this.tcs.SetException(new Exception($"request error: {this.Request.error}")); return; } if (!this.Request.isDone) { return; } if (!string.IsNullOrEmpty(this.Request.error)) { this.tcs.SetException(new Exception($"request error: {this.Request.error}")); return; } this.tcs.SetResult(); } public async ETTask DownloadAsync(string url) { this.tcs = new ETTaskCompletionSource(); url = url.Replace(" ", "%20"); this.Request = UnityWebRequest.Get(url); this.Request.certificateHandler = certificateHandler; this.Request.SendWebRequest(); await this.tcs.Task; } } }