1. 接收文件或二進制數據
從標准的Http或Https服務端接收簡單的文本或二進制數據,可以使用UnityWebRequest.GET方法。這個方法只需要傳入獲取數據的服務端URL即可。這個功能和標准的WWW的構造方法類似,如下面代碼所示:
WWW myWww = new WWW("http://www.myserver.com/foo.txt"); // ... is analogous to ...
UnityWebRequest myWr = UnityWebRequest.Get("http://www.myserver.com/foo.txt");
上面代碼的詳細流程是這樣的:
- 創建一個UnityWebRequest對象,並設置目標URL做為字符串參數,但是沒有設置自定義的數據和包頭信息
- UnityWebRequest會默認綁定一個標准的DownloadHandlerBuffer對象,當請求完成之后,這個Handler緩存從服務端接收到的數據,這些數據可以在代碼中直接使用。
- UnityWebRequest默認不會綁定一個UploadHandler對象,如果你需要的話,可以手動操作。
完整的例子如下所示:
using UnityEngine; using System.Collections; using UnityEngine.Networking; public class MyBehaviour : MonoBehaviour { void Start() { StartCoroutine(GetText()); } IEnumerator GetText() { UnityWebRequest www = UnityWebRequest.Get("http://www.my-server.com"); yield return www.SendWebRequest(); if(www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { // 接收文本數據,並打印到日志中
Debug.Log(www.downloadHandler.text); // 接收二進制數據
byte[] results = www.downloadHandler.data; } } }
2. 接收Texture
可以使用UnityWebRequest.Texture方法,從遠程服務端獲取一個Texture文件。這個功能和UnityWebRequest.GET方法非常類似,但是它對下載和存儲Texture文件做了優化,提高了處理效率。UnityWebRequest.Texture同樣需要一個字符串參數,這個參數就是要下載的資源的URL地址。
詳細的處理過程是這樣的:
- 創建一個UnityWebRequest對象,並設置目標URL做為字符串參數,但是沒有設置自定義的數據和包頭信息
- UnityWebRequest會默認綁定一個標准的DownloadHandlerTexture對象,DownloadHandlerTexture是一個特定的Download Handler,它會優化在Unity引擎中使用的圖片的存儲,相對來說,在下載二進制數據和創建在代碼中手動創建Texture對象時,它可以大大的減少內存的再分配。
- UnityWebRequest默認不會綁定一個UploadHandler對象,如果你需要的話,可以手動操作。
完整的例子如下所示:
using UnityEngine; using System.Collections; using UnityEngine.Networking; public class MyBehaviour : MonoBehaviour { void Start() { StartCoroutine(GetTexture()); } IEnumerator GetTexture() { UnityWebRequest www = UnityWebRequestTexture.GetTexture("http://www.my-server.com/image.png"); yield return www.SendWebRequest(); if(www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else {
//獲取並創建Texture Texture myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture; } } }
另外,也可以使用一個工具類,從UnityWebRequest中讀取Texture,如下所示:
IEnumerator GetTexture() { UnityWebRequest www = UnityWebRequestTexture.GetTexture("http://www.my-server.com/image.png"); yield return www.SendWebRequest(); //獲取Texture對象 Texture myTexture = DownloadHandlerTexture.GetContent(www); }
3. 下載AssetBundle
可以使用UnityWebRequest.GetAssetBundle方法,從遠程服務器下載一個AssetBundle,這個方法會在工作線程中,將下載的數據流解碼,解壓縮,並放到一個內部的buffer之中。這個方法有多種的參數形式,最簡單的方式它只需要一個下載AssetBundle文件的URL地址,你也可以選擇性的對下載的數據進行checksum校驗數據的完整性。另外,如果你想使用AssetBundle的緩存系統,你需要提供一個版本號或一個128位的Hash結構,這和舊系統中WWW.LoadFromCacheOrDownload提供的版本號和128位Hash對象是一樣的。
詳細的處理過程是這樣的:
- 這個方法會創建一個UnityWebRequest,並且設置目標URL和指定Http Get行為,不會再設置其它的標記或自定義包頭數據。
- 這個方法會給UnityWebRequest綁定一個DownloadHandlerAssetBundle對象,這個下載Handler有一個特殊的assetBundle屬性,它可以保證從下載的數據中,一次性提取出一個完整的AssetBundle,並解碼成AssetBundle對象,可以訪問這個AssetBundle中的資源。
- 如果你提供一個128位的Hash對象或一個版本號做為參數,這些參數也會被傳到DownloadHandlerBundle中,這個下載Handler然后就會使用緩存系統
下面是一個完整的例子:
using UnityEngine; using UnityEngine.Networking; using System.Collections; public class MyBehaviour : MonoBehaviour { void Start() { StartCoroutine(GetAssetBundle()); } IEnumerator GetAssetBundle() { UnityWebRequest www = UnityWebRequest.GetAssetBundle("http://www.my-server.com/myData.unity3d"); yield return www.SendWebRequest(); if(www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www); } } }
4. 向服務端發送form數據
在UnityWebRequest中,有兩種基本的方法可以向服務端發送HTML form格式的數據,在web開發中,這種方式叫提交一個表單數據。
第一種方式:使用 IMultipartFormSection
為了更好的控制form數據,UnityWebRequest系統提供了一個用戶可以實現的接口:IMultipartFormSection,對於一般的應用程序,Unity也提供了兩個默認實現的類,MultipartFormDataSection,用於提交form表單數據,MultipartFormFileSection,用於上傳文件。
UnityWebRequest.POST的一個重載方式,接收一個List參數,做為該方法的第二個參數,但是這個List的成員必須是IMultipartFormSections的子類,如下面代碼所示:
UnityWebRequest.Post(string url, List<IMultipartFormSection> formSections);
詳細過程是這樣的:
- 這個方法會創建一個新的UnityWebRequest對象,並設置目標URL做為第一個參數,也可以給這次本提交的
IMultipartFormSection
列表form數據在Header中設置合適的Content-Type值。 - 這個方法默認會給UnityWebRequest綁定一個DownloadHandlerBuffer,這樣做是為了方便獲取服務器響應的數據。
- 和WWWForm Post方法類型,這個HLAPI方法也是按順序調每一個
IMultipartFormSection
,將它們組裝成一個符合RFC 2616標准的multipart form格式的數據。 - 這些預定義好的Form數據會被存儲在UploadHanlderRaw對象中,然后把這個對象綁定到UnityWebRequest中,所以,當調用UnityWebRequest.POST方法之后,再修改
IMultipartFormSection
對象的數據,將不會影響到發送給服務器的數據。
如下面代碼所示:
using UnityEngine; using UnityEngine.Networking; using System.Collections; using System.Collections.Generic; public class MyBehavior : MonoBehaviour { void Start() { StartCoroutine(Upload()); } IEnumerator Upload() { List<IMultipartFormSection> formData = new List<IMultipartFormSection>(); formData.Add(new MultipartFormDataSection("field1=foo&field2=bar")); formData.Add(new MultipartFormFileSection("my file data", "myfile.txt")); UnityWebRequest www = UnityWebRequest.Post("http://www.my-server.com/myform", formData); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { Debug.Log("Form upload complete!"); } } }
第二種方式使用WWWForm(遺留的方法)
為了方便從 WWW 系統中遷移,UnityWebRequest允許你使用WWWForm 對象提供form數據,如下面代碼所示:
UnityWebRequest.Post(string url, WWWForm formData);
詳細過程是這樣的:
- 這個方法會創建一個新的UnityWebRequest對象,並設置目標URL做為第一個參數,它也會讀取WWWForm中自定義的包頭信息,並將它們復制到UnityWebRequest中
- 這個方法默認會給UnityWebRequest綁定一個DownloadHandlerBuffer,這樣做是為了方便獲取服務器響應的數據。
- 這個方法會讀取WWWForm對象中原始的數據,並將它們緩存到一個UploadHandlerRaw對象中,然后將它綁定到UntiyWebRequest中,因此,在調用UnityWebRequest.POST方法之后,再修改原來WWWForm中的數據,將不會改變UntiyWebRequest中的內容。
如下面例子所示:
using UnityEngine; using UnityEngine.Networking; using System.Collections; public class MyBehavior : public MonoBehaviour { void Start() { StartCoroutine(Upload()); } IEnumerator Upload() { WWWForm form = new WWWForm(); form.AddField("myField", "myData"); UnityWebRequest www = UnityWebRequest.Post("http://www.my-server.com/myform", form); yield return www.SendWebRequest(); if(www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { Debug.Log("Form upload complete!"); } } }