using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
/* 使用案例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestScript : MonoBehaviour
{
public RawImage rawImage;
public Text text;
// Start is called before the first frame update
void Start()
{
// 获取图片
UnityWebRequestMgr.Instance.GetTexture(Application.dataPath + "/TestAssets/Cat.jpg",
SetTexttureToRawImage);
// 获取文本
UnityWebRequestMgr.Instance.Get(Application.dataPath + "/TestAssets/TextFile.txt",
(uwr) => { text.text = uwr.downloadHandler.text; });
// 下载文件
UnityWebRequestMgr.Instance.DownloadFile(Application.dataPath + "/TestAssets/TextFile.txt",
Application.dataPath + "/TestAssets/DownloadTextFile.txt",
(uwr) => { Debug.Log("文件下载成功:" + Application.dataPath + "/TestAssets/DownloadTextFile.txt"); });
// 获取音频文件
UnityWebRequestMgr.Instance.GetAudioClip(Application.dataPath + "/TestAssets/AttackFire.wav",
(audioclip) => {
this.gameObject.AddComponent<AudioSource>().clip = audioclip;
this.gameObject.GetComponent<AudioSource>().Play();
},
AudioType.WAV
);
}
void SetTexttureToRawImage(Texture texture) {
rawImage.texture = texture;
}
}
*/
/// <summary>
///UnityWebRequest下载上传资源管理器
/// </summary>
public class UnityWebRequestMgr : MonoBehaviour
{
#region 单例
private static UnityWebRequestMgr instance = null;
private static readonly object locker = new object();
private static bool bAppQuitting;
public static UnityWebRequestMgr Instance
{
get
{
if (bAppQuitting)
{
instance = null;
return instance;
}
lock (locker)
{
if (instance == null)
{
instance = FindObjectOfType<UnityWebRequestMgr>();
if (FindObjectsOfType<UnityWebRequestMgr>().Length > 1)
{
Debug.LogError("不应该存在多个单例!");
return instance;
}
if (instance == null)
{
var singleton = new GameObject();
instance = singleton.AddComponent<UnityWebRequestMgr>();
singleton.name = "(singleton)" + typeof(UnityWebRequestMgr);
singleton.hideFlags = HideFlags.None;
DontDestroyOnLoad(singleton);
}
else
DontDestroyOnLoad(instance.gameObject);
}
instance.hideFlags = HideFlags.None;
return instance;
}
}
}
private void Awake()
{
bAppQuitting = false;
}
private void OnDestroy()
{
bAppQuitting = true;
}
#endregion
/// <summary>
/// GET请求
/// </summary>
/// <param name="url"></param>
/// <param name="action"></param>
public void Get(string url, Action<UnityWebRequest> actionResult)
{
StartCoroutine(_Get(url, actionResult));
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="downloadFilePathAndName">储存文件的路径和文件名 like 'Application.persistentDataPath+"/unity3d.html"'</param>
/// <param name="actionResult">请求发起后处理回调结果的委托,处理请求对象</param>
/// <returns></returns>
public void DownloadFile(string url, string downloadFilePathAndName, Action<UnityWebRequest> actionResult)
{
StartCoroutine(_DownloadFile(url, downloadFilePathAndName, actionResult));
}
/// <summary>
/// 请求图片
/// </summary>
/// <param name="url">图片地址,like 'http://www.shijing720.com/image.png '</param>
/// <param name="action">请求发起后处理回调结果的委托,处理请求结果的图片</param>
/// <returns></returns>
public void GetTexture(string url, Action<Texture2D> actionResult)
{
StartCoroutine(_GetTexture(url, actionResult));
}
/// <summary>
/// 请求AssetBundle
/// </summary>
/// <param name="url">AssetBundle地址,like 'http://www.shijing720.com/myData.unity3d'</param>
/// <param name="actionResult">请求发起后处理回调结果的委托,处理请求结果的AssetBundle</param>
/// <returns></returns>
public void GetAssetBundle(string url, Action<AssetBundle> actionResult)
{
StartCoroutine(_GetAssetBundle(url, actionResult));
}
/// <summary>
/// 请求服务器地址上的音效
/// </summary>
/// <param name="url">没有音效地址,like 'http://www.shijing720.com/mysound.wav'</param>
/// <param name="actionResult">请求发起后处理回调结果的委托,处理请求结果的AudioClip</param>
/// <param name="audioType">音效类型</param>
/// <returns></returns>
public void GetAudioClip(string url, Action<AudioClip> actionResult, AudioType audioType = AudioType.WAV)
{
StartCoroutine(_GetAudioClip(url, actionResult, audioType));
}
/// <summary>
/// 向服务器提交post请求
/// </summary>
/// <param name="serverURL">服务器请求目标地址,like "http://www.shijing720.com/myform"</param>
/// <param name="lstformData">form表单参数</param>
/// <param name="lstformData">处理返回结果的委托,处理请求对象</param>
/// <returns></returns>
public void Post(string serverURL, List<IMultipartFormSection> lstformData, Action<UnityWebRequest> actionResult)
{
//List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
//formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));
//formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));
StartCoroutine(_Post(serverURL, lstformData, actionResult));
}
/// <summary>
/// 通过PUT方式将字节流传到服务器
/// </summary>
/// <param name="url">服务器目标地址 like 'http://www.shijing720.com/upload' </param>
/// <param name="contentBytes">需要上传的字节流</param>
/// <param name="resultAction">处理返回结果的委托</param>
/// <returns></returns>
public void UploadByPut(string url, byte[] contentBytes, Action<bool> actionResult)
{
StartCoroutine(_UploadByPut(url, contentBytes, actionResult, ""));
}
/// <summary>
/// GET请求
/// </summary>
/// <param name="url">请求地址,like 'http://www.shijing720.com/ '</param>
/// <param name="action">请求发起后处理回调结果的委托</param>
/// <returns></returns>
IEnumerator _Get(string url, Action<UnityWebRequest> actionResult)
{
using (UnityWebRequest uwr = UnityWebRequest.Get(url))
{
yield return uwr.SendWebRequest();
if (!(uwr.isNetworkError || uwr.isHttpError))
{
if (actionResult != null)
{
actionResult(uwr);
}
}
else
{
Debug.Log("下载失败,请检查网络,或者下载地址是否正确: " + url);
}
}
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="downloadFilePathAndName">储存文件的路径和文件名 like 'Application.persistentDataPath+"/unity3d.html"'</param>
/// <param name="actionResult">请求发起后处理回调结果的委托,处理请求对象</param>
/// <returns></returns>
IEnumerator _DownloadFile(string url, string downloadFilePathAndName, Action<UnityWebRequest> actionResult)
{
var uwr = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET);
uwr.downloadHandler = new DownloadHandlerFile(downloadFilePathAndName);
yield return uwr.SendWebRequest();
if (!(uwr.isNetworkError || uwr.isHttpError))
{
if (actionResult != null)
{
actionResult(uwr);
}
}
else
{
Debug.Log("下载失败,请检查网络,或者下载地址是否正确: " + url);
}
}
/// <summary>
/// 请求图片
/// </summary>
/// <param name="url">图片地址,like 'http://www.shijing720.com/image.png '</param>
/// <param name="action">请求发起后处理回调结果的委托,处理请求结果的图片</param>
/// <returns></returns>
IEnumerator _GetTexture(string url, Action<Texture2D> actionResult)
{
UnityWebRequest uwr = new UnityWebRequest(url);
DownloadHandlerTexture downloadTexture = new DownloadHandlerTexture(true);
uwr.downloadHandler = downloadTexture;
yield return uwr.SendWebRequest();
Texture2D t = null;
if (!(uwr.isNetworkError || uwr.isHttpError))
{
t = downloadTexture.texture;
}
else
{
Debug.Log("下载失败,请检查网络,或者下载地址是否正确: " + url);
}
if (actionResult != null)
{
actionResult(t);
}
}
/// <summary>
/// 请求AssetBundle
/// </summary>
/// <param name="url">AssetBundle地址,like 'http://www.shijing720.com/myData.unity3d'</param>
/// <param name="actionResult">请求发起后处理回调结果的委托,处理请求结果的AssetBundle</param>
/// <returns></returns>
IEnumerator _GetAssetBundle(string url, Action<AssetBundle> actionResult)
{
UnityWebRequest www = new UnityWebRequest(url);
DownloadHandlerAssetBundle handler = new DownloadHandlerAssetBundle(www.url, uint.MaxValue);
www.downloadHandler = handler;
yield return www.SendWebRequest();
AssetBundle bundle = null;
if (!(www.isNetworkError || www.isHttpError))
{
bundle = handler.assetBundle;
if (actionResult != null)
{
actionResult(bundle);
}
}
else
{
Debug.Log("下载失败,请检查网络,或者下载地址是否正确: " + url);
}
}
/// <summary>
/// 请求服务器地址上的音效
/// </summary>
/// <param name="url">没有音效地址,like 'http://www.shijing720.com/mysound.wav'</param>
/// <param name="actionResult">请求发起后处理回调结果的委托,处理请求结果的AudioClip</param>
/// <param name="audioType">音效类型</param>
/// <returns></returns>
IEnumerator _GetAudioClip(string url, Action<AudioClip> actionResult, AudioType audioType = AudioType.WAV)
{
using (var uwr = UnityWebRequestMultimedia.GetAudioClip(url, audioType))
{
yield return uwr.SendWebRequest();
if (!(uwr.isNetworkError || uwr.isHttpError))
{
if (actionResult != null)
{
actionResult(DownloadHandlerAudioClip.GetContent(uwr));
}
}
else {
Debug.Log("下载失败,请检查网络,或者下载地址是否正确: " + url);
}
}
}
/// <summary>
/// 向服务器提交post请求
/// </summary>
/// <param name="serverURL">服务器请求目标地址,like "http://www.shijing720.com/myform"</param>
/// <param name="lstformData">form表单参数</param>
/// <param name="lstformData">处理返回结果的委托</param>
/// <returns></returns>
IEnumerator _Post(string serverURL, List<IMultipartFormSection> lstformData, Action<UnityWebRequest> actionResult)
{
//List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
//formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));
//formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));
UnityWebRequest uwr = UnityWebRequest.Post(serverURL, lstformData);
yield return uwr.SendWebRequest();
if (actionResult != null)
{
actionResult(uwr);
}
}
/// <summary>
/// 通过PUT方式将字节流传到服务器
/// </summary>
/// <param name="url">服务器目标地址 like 'http://www.shijing720.com/upload' </param>
/// <param name="contentBytes">需要上传的字节流</param>
/// <param name="resultAction">处理返回结果的委托</param>
/// <param name="resultAction">设置header文件中的Content-Type属性</param>
/// <returns></returns>
IEnumerator _UploadByPut(string url, byte[] contentBytes, Action<bool> actionResult, string contentType = "application/octet-stream")
{
UnityWebRequest uwr = new UnityWebRequest();
UploadHandler uploader = new UploadHandlerRaw(contentBytes);
// Sends header: "Content-Type: custom/content-type";
uploader.contentType = contentType;
uwr.uploadHandler = uploader;
yield return uwr.SendWebRequest();
bool res = true;
if (uwr.isNetworkError || uwr.isHttpError)
{
res = false;
}
if (actionResult != null)
{
actionResult(res);
}
}
}
来源:CSDN
作者:LixiSchool
链接:https://blog.csdn.net/lizhenxiqnmlgb/article/details/104263503