UnityWebRequest 高級API常用的操作


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!");
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM