当前位置:   article > 正文

封装UnityWebRequest_sendwebrequest必须和yieldreturn一起使用吗?

sendwebrequest必须和yieldreturn一起使用吗?

未完待续.....

  1. using System;
  2. using System.Collections;
  3. using UnityEngine;
  4. using UnityEngine.Networking;
  5. using System.IO;
  6. public class QWebRequest : MonoBehaviour
  7. {
  8. private static QWebRequest instance;
  9. private static QWebRequest Instance
  10. {
  11. get
  12. {
  13. return instance ?? (instance = new GameObject("QWebRequest").AddComponent<QWebRequest>());
  14. }
  15. }
  16. #region startDownload
  17. /// <summary>
  18. /// 下载文本
  19. /// </summary>
  20. /// <param name="url">请求的链接</param>
  21. /// <param name="action">发生的事件</param>
  22. /// <param name="method">请求的方式</param>
  23. /// <returns></returns>
  24. public static bool DownloadText(string url, RequestTextEvent action, string method = UnityWebRequest.kHttpVerbGET)
  25. {
  26. if (IsNull(url, action, action.action)) return true;
  27. Instance.StartCoroutine(Instance.DownloadTextIEnumerator( url,method, action));
  28. return false;
  29. }
  30. /// <summary>
  31. /// 下载数据
  32. /// </summary>
  33. /// <param name="url">请求的链接</param>
  34. /// <param name="action">发生的事件</param>
  35. /// <param name="method">请求的方式</param>
  36. /// <returns></returns>
  37. public static bool DownloadData(string url, RequestDataEvent action, string method = UnityWebRequest.kHttpVerbGET)
  38. {
  39. if (IsNull(url, action, action.action)) return true;
  40. Instance.StartCoroutine(Instance.DownloadDataIEnumerator(url,method,action));
  41. return false;
  42. }
  43. /// <summary>
  44. /// 下载文件[文件存放位置不能重复]
  45. /// </summary>
  46. /// <param name="url">请求的链接</param>
  47. /// <param name="savePath">保存的路径</param>
  48. /// <param name="action">发生的事件</param>
  49. /// <param name="method">请求的方式</param>
  50. /// <returns></returns>
  51. public static bool DownloadFile(string url, string savePath, RequestFileEvent action, string method = UnityWebRequest.kHttpVerbGET)
  52. {
  53. if(string.IsNullOrEmpty(url) || action==null)return true;
  54. Instance.StartCoroutine(Instance.DownloadFileIEnumerator(url,savePath,method,action));
  55. return false;
  56. }
  57. /// <summary>
  58. /// 下载图片
  59. /// </summary>
  60. /// <param name="url">请求的链接</param>
  61. /// <param name="action">发生的事件</param>
  62. /// <param name="method">请求的方式</param>
  63. /// <returns></returns>
  64. public static bool DownaloadSprite(string url, RequestSpriteEvent action, string method = UnityWebRequest.kHttpVerbGET)
  65. {
  66. if (IsNull(url, action, action.action)) return true;
  67. Instance.StartCoroutine(Instance.DownloadSpriteIEnumerator(url,method,action));
  68. return false;
  69. }
  70. /// <summary>
  71. /// 下载AssetBundle
  72. /// </summary>
  73. /// <param name="url">请求的链接</param>
  74. /// <param name="action">发生的事件</param>
  75. /// <param name="method">请求的方式</param>
  76. /// <returns></returns>
  77. public static bool DownaloadAssetBundle(string url, RequestAssetBundleEvent action, string method = UnityWebRequest.kHttpVerbGET)
  78. {
  79. if (IsNull(url, action, action.action)) return true;
  80. Instance.StartCoroutine(Instance.DownloadAssetBundleIEnumerator(url,method,action));
  81. return false;
  82. }
  83. /// <summary>
  84. /// 下载音频
  85. /// </summary>
  86. /// <param name="url">请求的链接</param>
  87. /// <param name="audioType">音频格式</param>
  88. /// <param name="action">发生的事件</param>
  89. /// <returns></returns>
  90. public static bool DownloadAudioClip(string url, RequestAudioClipEvent action, AudioType audioType=AudioType.AUDIOQUEUE)
  91. {
  92. if (IsNull(url, action, action.action)) return true;
  93. Instance.StartCoroutine(Instance.DownloadAudioClipIEnumerator(url,audioType,action));
  94. return false;
  95. }
  96. /// <summary>
  97. /// 下载视频
  98. /// </summary>
  99. /// <param name="url">请求的链接</param>
  100. /// <param name="action">发生的事件</param>
  101. /// <returns></returns>
  102. public static bool DownloadMovieTexture(string url, RequestMovieTextureEvent action)
  103. {
  104. if (IsNull(url, action, action.action)) return true;
  105. Instance.StartCoroutine(Instance.DownloadMovieTextureIEnumerator(url,action));
  106. return false;
  107. }
  108. #endregion
  109. IEnumerator DownloadTextIEnumerator(string url, string method, RequestTextEvent action)
  110. {
  111. var request = new UnityWebRequest(url, method);
  112. request.downloadHandler = new DownloadHandlerBuffer();
  113. if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
  114. yield return request.SendWebRequest();
  115. Dispose(request,() =>
  116. {
  117. action.action(request.downloadHandler.text);
  118. }, action.error, action.error404, action.error500);
  119. }
  120. IEnumerator DownloadDataIEnumerator( string url, string method, RequestDataEvent action)
  121. {
  122. var request = new UnityWebRequest(url, method);
  123. request.downloadHandler = new DownloadHandlerBuffer();
  124. if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
  125. yield return request.SendWebRequest();
  126. Dispose(request,() =>
  127. {
  128. action.action(request.downloadHandler.data);
  129. }, action.error, action.error404, action.error500);
  130. }
  131. IEnumerator DownloadFileIEnumerator(string url, string savePath, string method, RequestFileEvent action)
  132. {
  133. if (!File.Exists(savePath))
  134. {
  135. var request = new UnityWebRequest(url, method);
  136. request.downloadHandler = new DownloadHandlerFile(savePath);
  137. if (action.downloadProgress != null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
  138. yield return request.SendWebRequest();
  139. Dispose(request, () =>
  140. {
  141. Debug.Log("File successfully downloaded and saved to " + savePath);
  142. if (action != null) action.action();
  143. }, action.error, action.error404, action.error500);
  144. }else{
  145. action.failedCreateFile();
  146. }
  147. }
  148. IEnumerator DownloadSpriteIEnumerator(string url, string method, RequestSpriteEvent action)
  149. {
  150. var request = new UnityWebRequest(url, method);
  151. var texDl = new DownloadHandlerTexture(true);
  152. request.downloadHandler = texDl;
  153. if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
  154. yield return request.SendWebRequest();
  155. Dispose(request,() =>
  156. {
  157. Texture2D t = texDl.texture;
  158. action.action(Sprite.Create(t, new Rect(0, 0, t.width, t.height), Vector2.zero, 1f),texDl.data);
  159. }, action.error, action.error404, action.error500);
  160. }
  161. IEnumerator DownloadAssetBundleIEnumerator(string url, string method, RequestAssetBundleEvent action)
  162. {
  163. var request = new UnityWebRequest(url, method);
  164. var handler = new DownloadHandlerAssetBundle(request.url, uint.MaxValue);
  165. request.downloadHandler = handler;
  166. if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
  167. yield return request.SendWebRequest();
  168. Dispose(request,() =>
  169. {
  170. action.action(handler.assetBundle);
  171. }, action.error, action.error404, action.error500);
  172. }
  173. IEnumerator DownloadAudioClipIEnumerator(string url, AudioType audioType, RequestAudioClipEvent action)
  174. {
  175. var request = UnityWebRequestMultimedia.GetAudioClip(url, audioType);
  176. if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
  177. yield return request.SendWebRequest();
  178. Dispose(request,() =>
  179. {
  180. action.action(DownloadHandlerAudioClip.GetContent(request));
  181. }, action.error, action.error404, action.error500);
  182. }
  183. IEnumerator DownloadMovieTextureIEnumerator(string url, RequestMovieTextureEvent action)
  184. {
  185. var request = UnityWebRequestMultimedia.GetMovieTexture(url);
  186. if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
  187. yield return request.SendWebRequest();
  188. Dispose(request,() =>
  189. {
  190. action.action(DownloadHandlerMovieTexture.GetContent(request));
  191. }, action.error, action.error404, action.error500);
  192. }
  193. IEnumerator DownloadProgress(UnityWebRequest request, Action<float> action)
  194. {
  195. while (!request.isDone)
  196. {
  197. yield return null;
  198. action(request.downloadProgress);
  199. }
  200. request.Abort();
  201. Resources.UnloadUnusedAssets();
  202. }
  203. private void Dispose(UnityWebRequest request,Action ok, Action<string> error, Action error404, Action error500)
  204. {
  205. QDebug.Log(string.Format("url [ {0} ]\nerror [ {1} ]",request.url,request.error));
  206. if (request.isHttpError || request.isNetworkError)
  207. {
  208. if (error != null) error(request.error);
  209. }
  210. else
  211. {
  212. switch (request.responseCode)
  213. {
  214. case 200: if (ok != null) ok(); break;
  215. case 404: if (error404 != null) error404(); break;
  216. case 500: if (error500 != null) error500(); break;
  217. }
  218. }
  219. }
  220. private static bool IsNull(string url, BaseRequestEvent requestAction, object action)
  221. {
  222. if (string.IsNullOrEmpty(url) || requestAction == null || action == null)
  223. {
  224. QDebug.Log("Can't be empty");
  225. return true;
  226. }
  227. return false;
  228. }
  229. public class BaseRequestEvent
  230. {
  231. public Action<float> downloadProgress;
  232. public Action<string> error;
  233. public Action error404;
  234. public Action error500;
  235. }
  236. /// <summary>
  237. /// 文本请求事件
  238. /// </summary>
  239. public class RequestTextEvent : BaseRequestEvent
  240. {
  241. public Action<string> action;
  242. }
  243. /// <summary>
  244. /// 数据请求事件
  245. /// </summary>
  246. public class RequestDataEvent : BaseRequestEvent
  247. {
  248. public Action<byte[]> action;
  249. }
  250. /// <summary>
  251. /// 文件请求事件
  252. /// </summary>
  253. public class RequestFileEvent:BaseRequestEvent
  254. {
  255. public Action action;
  256. public Action failedCreateFile;
  257. }
  258. /// <summary>
  259. /// 图片请求事件
  260. /// </summary>
  261. public class RequestSpriteEvent : BaseRequestEvent
  262. {
  263. public Action<Sprite,byte[]> action;
  264. }
  265. /// <summary>
  266. /// 文本请求事件
  267. /// </summary>
  268. public class RequestAssetBundleEvent : BaseRequestEvent
  269. {
  270. public Action<AssetBundle> action;
  271. }
  272. /// <summary>
  273. /// 音频请求事件
  274. /// </summary>
  275. public class RequestAudioClipEvent : BaseRequestEvent
  276. {
  277. public Action<AudioClip> action;
  278. }
  279. /// <summary>
  280. /// 视频请求事件
  281. /// </summary>
  282. public class RequestMovieTextureEvent : BaseRequestEvent
  283. {
  284. public Action<MovieTexture> action;
  285. }
  286. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号