当前位置:   article > 正文

Unity 工具类 之 简单网络下载管理类 UnityWebRequestManager 实现_unity webrequest netmgr

unity webrequest netmgr

 Unity 工具类 之 简单网络下载类 UnityWebRequestManager 实现

 

目录

 Unity 工具类 之 简单网络下载类 UnityWebRequestManager 实现

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码

七、参考工程


 

 

一、简单介绍

Unity 工具类,自己整理的一些游戏开发可能用到的模块,单独独立使用,方便游戏开发。

简单网络下载管理类,单独做了一个单例类,提供进行网络地址或者本地地址下载网络资源或者本地资源到游戏中的封装接口,供外界调用。

 

二、实现原理

1、单例类,保证整个场景中只有一个类管理场景加载;

2、UnityWebRequest 实现网络或者本地资源下载;

3、UnityWebRequestManager.Instance.GetTexture 下载图片

4、UnityWebRequestManager.Instance.Get 下载文本文件

5、UnityWebRequestManager.Instance.DownloadFile 下载文件到指定路径

6、UnityWebRequestManager.Instance.GetAudioClip 下载音频文件

7、等等,还包括一些简单的上传文件的接口

 

三、注意事项

1、UnityWebRequestManager.Instance.GetAudioClip 不同平台支持的音频格式可能会有限制

 

四、效果预览

 

五、实现步骤

1、打开Unity,新建一个工程,然后导入一些资源,供下载测试,如下图

 

2、在场景中添加一些UI,用于测试下载的图片和 文本信息,如下图

 

3、新建脚本,单例类,网络下载管理类,测试类,如下图

 

4、把测试脚本挂载到场景中,并对应赋值,如下图

 

5、运行场景,效果如下

 

六、关键代码

1、TestScript

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class TestScript : MonoBehaviour
  6. {
  7. public RawImage rawImage;
  8. public Text text;
  9. // Start is called before the first frame update
  10. void Start()
  11. {
  12. // 获取图片
  13. UnityWebRequestManager.Instance.GetTexture(Application.dataPath + "/TestAssets/Cat.jpg",
  14. SetTexttureToRawImage);
  15. // 获取文本
  16. UnityWebRequestManager.Instance.Get(Application.dataPath + "/TestAssets/TextFile.txt",
  17. (uwr) => { text.text = uwr.downloadHandler.text; });
  18. // 下载文件
  19. UnityWebRequestManager.Instance.DownloadFile(Application.dataPath + "/TestAssets/TextFile.txt",
  20. Application.dataPath + "/TestAssets/DownloadTextFile.txt",
  21. (uwr) => { Debug.Log("文件下载成功:" + Application.dataPath + "/TestAssets/DownloadTextFile.txt"); });
  22. // 获取音频文件
  23. UnityWebRequestManager.Instance.GetAudioClip(Application.dataPath + "/TestAssets/AttackFire.wav",
  24. (audioclip) => {
  25. this.gameObject.AddComponent<AudioSource>().clip = audioclip;
  26. this.gameObject.GetComponent<AudioSource>().Play();
  27. },
  28. AudioType.WAV
  29. );
  30. }
  31. void SetTexttureToRawImage(Texture texture) {
  32. rawImage.texture = texture;
  33. }
  34. }

 

2、UnityWebRequestManager

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.Networking;
  6. public class UnityWebRequestManager : MonoSingleton<UnityWebRequestManager>
  7. {
  8. /// <summary>
  9. /// GET请求
  10. /// </summary>
  11. /// <param name="url"></param>
  12. /// <param name="action"></param>
  13. public void Get(string url, Action<UnityWebRequest> actionResult)
  14. {
  15. StartCoroutine(_Get(url, actionResult));
  16. }
  17. /// <summary>
  18. /// 下载文件
  19. /// </summary>
  20. /// <param name="url">请求地址</param>
  21. /// <param name="downloadFilePathAndName">储存文件的路径和文件名 like 'Application.persistentDataPath+"/unity3d.html"'</param>
  22. /// <param name="actionResult">请求发起后处理回调结果的委托,处理请求对象</param>
  23. /// <returns></returns>
  24. public void DownloadFile(string url, string downloadFilePathAndName, Action<UnityWebRequest> actionResult)
  25. {
  26. StartCoroutine(_DownloadFile(url, downloadFilePathAndName, actionResult));
  27. }
  28. /// <summary>
  29. /// 请求图片
  30. /// </summary>
  31. /// <param name="url">图片地址,like 'http://www.my-server.com/image.png '</param>
  32. /// <param name="action">请求发起后处理回调结果的委托,处理请求结果的图片</param>
  33. /// <returns></returns>
  34. public void GetTexture(string url, Action<Texture2D> actionResult)
  35. {
  36. StartCoroutine(_GetTexture(url, actionResult));
  37. }
  38. /// <summary>
  39. /// 请求AssetBundle
  40. /// </summary>
  41. /// <param name="url">AssetBundle地址,like 'http://www.my-server.com/myData.unity3d'</param>
  42. /// <param name="actionResult">请求发起后处理回调结果的委托,处理请求结果的AssetBundle</param>
  43. /// <returns></returns>
  44. public void GetAssetBundle(string url, Action<AssetBundle> actionResult)
  45. {
  46. StartCoroutine(_GetAssetBundle(url, actionResult));
  47. }
  48. /// <summary>
  49. /// 请求服务器地址上的音效
  50. /// </summary>
  51. /// <param name="url">没有音效地址,like 'http://myserver.com/mysound.wav'</param>
  52. /// <param name="actionResult">请求发起后处理回调结果的委托,处理请求结果的AudioClip</param>
  53. /// <param name="audioType">音效类型</param>
  54. /// <returns></returns>
  55. public void GetAudioClip(string url, Action<AudioClip> actionResult, AudioType audioType = AudioType.WAV)
  56. {
  57. StartCoroutine(_GetAudioClip(url, actionResult, audioType));
  58. }
  59. /// <summary>
  60. /// 向服务器提交post请求
  61. /// </summary>
  62. /// <param name="serverURL">服务器请求目标地址,like "http://www.my-server.com/myform"</param>
  63. /// <param name="lstformData">form表单参数</param>
  64. /// <param name="lstformData">处理返回结果的委托,处理请求对象</param>
  65. /// <returns></returns>
  66. public void Post(string serverURL, List<IMultipartFormSection> lstformData, Action<UnityWebRequest> actionResult)
  67. {
  68. //List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
  69. //formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));
  70. //formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));
  71. StartCoroutine(_Post(serverURL, lstformData, actionResult));
  72. }
  73. /// <summary>
  74. /// 通过PUT方式将字节流传到服务器
  75. /// </summary>
  76. /// <param name="url">服务器目标地址 like 'http://www.my-server.com/upload' </param>
  77. /// <param name="contentBytes">需要上传的字节流</param>
  78. /// <param name="resultAction">处理返回结果的委托</param>
  79. /// <returns></returns>
  80. public void UploadByPut(string url, byte[] contentBytes, Action<bool> actionResult)
  81. {
  82. StartCoroutine(_UploadByPut(url, contentBytes, actionResult, ""));
  83. }
  84. /// <summary>
  85. /// GET请求
  86. /// </summary>
  87. /// <param name="url">请求地址,like 'http://www.my-server.com/ '</param>
  88. /// <param name="action">请求发起后处理回调结果的委托</param>
  89. /// <returns></returns>
  90. IEnumerator _Get(string url, Action<UnityWebRequest> actionResult)
  91. {
  92. using (UnityWebRequest uwr = UnityWebRequest.Get(url))
  93. {
  94. yield return uwr.SendWebRequest();
  95. if (!(uwr.isNetworkError || uwr.isHttpError))
  96. {
  97. if (actionResult != null)
  98. {
  99. actionResult(uwr);
  100. }
  101. }
  102. else
  103. {
  104. Debug.Log("下载失败,请检查网络,或者下载地址是否正确 ");
  105. }
  106. }
  107. }
  108. /// <summary>
  109. /// 下载文件
  110. /// </summary>
  111. /// <param name="url">请求地址</param>
  112. /// <param name="downloadFilePathAndName">储存文件的路径和文件名 like 'Application.persistentDataPath+"/unity3d.html"'</param>
  113. /// <param name="actionResult">请求发起后处理回调结果的委托,处理请求对象</param>
  114. /// <returns></returns>
  115. IEnumerator _DownloadFile(string url, string downloadFilePathAndName, Action<UnityWebRequest> actionResult)
  116. {
  117. var uwr = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET);
  118. uwr.downloadHandler = new DownloadHandlerFile(downloadFilePathAndName);
  119. yield return uwr.SendWebRequest();
  120. if (!(uwr.isNetworkError || uwr.isHttpError))
  121. {
  122. if (actionResult != null)
  123. {
  124. actionResult(uwr);
  125. }
  126. }
  127. else
  128. {
  129. Debug.Log("下载失败,请检查网络,或者下载地址是否正确 ");
  130. }
  131. }
  132. /// <summary>
  133. /// 请求图片
  134. /// </summary>
  135. /// <param name="url">图片地址,like 'http://www.my-server.com/image.png '</param>
  136. /// <param name="action">请求发起后处理回调结果的委托,处理请求结果的图片</param>
  137. /// <returns></returns>
  138. IEnumerator _GetTexture(string url, Action<Texture2D> actionResult)
  139. {
  140. UnityWebRequest uwr = new UnityWebRequest(url);
  141. DownloadHandlerTexture downloadTexture = new DownloadHandlerTexture(true);
  142. uwr.downloadHandler = downloadTexture;
  143. yield return uwr.SendWebRequest();
  144. Texture2D t = null;
  145. if (!(uwr.isNetworkError || uwr.isHttpError))
  146. {
  147. t = downloadTexture.texture;
  148. }
  149. else
  150. {
  151. Debug.Log("下载失败,请检查网络,或者下载地址是否正确 ");
  152. }
  153. if (actionResult != null)
  154. {
  155. actionResult(t);
  156. }
  157. }
  158. /// <summary>
  159. /// 请求AssetBundle
  160. /// </summary>
  161. /// <param name="url">AssetBundle地址,like 'http://www.my-server.com/myData.unity3d'</param>
  162. /// <param name="actionResult">请求发起后处理回调结果的委托,处理请求结果的AssetBundle</param>
  163. /// <returns></returns>
  164. IEnumerator _GetAssetBundle(string url, Action<AssetBundle> actionResult)
  165. {
  166. UnityWebRequest www = new UnityWebRequest(url);
  167. DownloadHandlerAssetBundle handler = new DownloadHandlerAssetBundle(www.url, uint.MaxValue);
  168. www.downloadHandler = handler;
  169. yield return www.SendWebRequest();
  170. AssetBundle bundle = null;
  171. if (!(www.isNetworkError || www.isHttpError))
  172. {
  173. bundle = handler.assetBundle;
  174. if (actionResult != null)
  175. {
  176. actionResult(bundle);
  177. }
  178. }
  179. else
  180. {
  181. Debug.Log("下载失败,请检查网络,或者下载地址是否正确 ");
  182. }
  183. }
  184. /// <summary>
  185. /// 请求服务器地址上的音效
  186. /// </summary>
  187. /// <param name="url">没有音效地址,like 'http://myserver.com/mysound.wav'</param>
  188. /// <param name="actionResult">请求发起后处理回调结果的委托,处理请求结果的AudioClip</param>
  189. /// <param name="audioType">音效类型</param>
  190. /// <returns></returns>
  191. IEnumerator _GetAudioClip(string url, Action<AudioClip> actionResult, AudioType audioType = AudioType.WAV)
  192. {
  193. using (var uwr = UnityWebRequestMultimedia.GetAudioClip(url, audioType))
  194. {
  195. yield return uwr.SendWebRequest();
  196. if (!(uwr.isNetworkError || uwr.isHttpError))
  197. {
  198. if (actionResult != null)
  199. {
  200. actionResult(DownloadHandlerAudioClip.GetContent(uwr));
  201. }
  202. }
  203. else {
  204. Debug.Log("下载失败,请检查网络,或者下载地址是否正确 ");
  205. }
  206. }
  207. }
  208. /// <summary>
  209. /// 向服务器提交post请求
  210. /// </summary>
  211. /// <param name="serverURL">服务器请求目标地址,like "http://www.my-server.com/myform"</param>
  212. /// <param name="lstformData">form表单参数</param>
  213. /// <param name="lstformData">处理返回结果的委托</param>
  214. /// <returns></returns>
  215. IEnumerator _Post(string serverURL, List<IMultipartFormSection> lstformData, Action<UnityWebRequest> actionResult)
  216. {
  217. //List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
  218. //formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));
  219. //formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));
  220. UnityWebRequest uwr = UnityWebRequest.Post(serverURL, lstformData);
  221. yield return uwr.SendWebRequest();
  222. if (actionResult != null)
  223. {
  224. actionResult(uwr);
  225. }
  226. }
  227. /// <summary>
  228. /// 通过PUT方式将字节流传到服务器
  229. /// </summary>
  230. /// <param name="url">服务器目标地址 like 'http://www.my-server.com/upload' </param>
  231. /// <param name="contentBytes">需要上传的字节流</param>
  232. /// <param name="resultAction">处理返回结果的委托</param>
  233. /// <param name="resultAction">设置header文件中的Content-Type属性</param>
  234. /// <returns></returns>
  235. IEnumerator _UploadByPut(string url, byte[] contentBytes, Action<bool> actionResult, string contentType = "application/octet-stream")
  236. {
  237. UnityWebRequest uwr = new UnityWebRequest();
  238. UploadHandler uploader = new UploadHandlerRaw(contentBytes);
  239. // Sends header: "Content-Type: custom/content-type";
  240. uploader.contentType = contentType;
  241. uwr.uploadHandler = uploader;
  242. yield return uwr.SendWebRequest();
  243. bool res = true;
  244. if (uwr.isNetworkError || uwr.isHttpError)
  245. {
  246. res = false;
  247. }
  248. if (actionResult != null)
  249. {
  250. actionResult(res);
  251. }
  252. }
  253. }

 

3、MonoSingleton

  1. using UnityEngine;
  2. public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
  3. {
  4. private static T instance = null;
  5. private static readonly object locker = new object();
  6. private static bool bAppQuitting;
  7. public static T Instance
  8. {
  9. get
  10. {
  11. if (bAppQuitting)
  12. {
  13. instance = null;
  14. return instance;
  15. }
  16. lock (locker)
  17. {
  18. if (instance == null)
  19. {
  20. instance = FindObjectOfType<T>();
  21. if (FindObjectsOfType<T>().Length > 1)
  22. {
  23. Debug.LogError("不应该存在多个单例!");
  24. return instance;
  25. }
  26. if (instance == null)
  27. {
  28. var singleton = new GameObject();
  29. instance = singleton.AddComponent<T>();
  30. singleton.name = "(singleton)" + typeof(T);
  31. singleton.hideFlags = HideFlags.None;
  32. DontDestroyOnLoad(singleton);
  33. }
  34. else
  35. DontDestroyOnLoad(instance.gameObject);
  36. }
  37. instance.hideFlags = HideFlags.None;
  38. return instance;
  39. }
  40. }
  41. }
  42. private void Awake()
  43. {
  44. bAppQuitting = false;
  45. }
  46. private void OnDestroy()
  47. {
  48. bAppQuitting = true;
  49. }
  50. }

 

七、参考工程

点击下载工程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/387555
推荐阅读
相关标签
  

闽ICP备14008679号