UnityWebgl平臺與JS交互、使用UnityWebRequest對接

UnityWebgl平臺與JS交互、使用UnityWebRequest對接

Unity與前端js交互

在UnityWebgl平臺上,經常會從前端獲取參數,如token、host等,使用jslib與前端js代碼進行交互。只需要在Plugins文件夾中創建一個xxx.jslib文件即可。
jslib文件代碼如下:

mergeInto(LibraryManager.library, {
	getUrlParams: function (defaultValue) {
		var name = Pointer_stringify(defaultValue);
  		var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //構造一個含有目標參數的正則表達式對象
  		var r = window.location.search.substr(1).match(reg);  //匹配目標參數
  		if (r != null){
			var returnStr = unescape(r[2]);
			var bufferSize = lengthBytesUTF8( returnStr) + 1;
			var buffer = _malloc(bufferSize);
			stringToUTF8(returnStr, buffer, bufferSize);
			 return buffer;
		} 
		else return null; //返回參數值
	},
 });

想要在Unity中調用jslib中的getUrlParams方法,只需要在Unity中合適的地方添加以下代碼後調用即可:

    [DllImport("__Internal")]
    private static extern string getUrlParams(string name);

注意:
在Unity中向js傳遞字符串時需要在js中使用Pointer_stringify(str)進行轉換。
在js中向Unity返回字符串的時候也需要進行如下操作:
var bufferSize = lengthBytesUTF8( returnStr) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(returnStr, buffer, bufferSize);
return buffer;

web數據請求

這裏封裝了一下UnityWebRequest,只需要提供對應的參數和回調即可進行數據請求,包括可選擇對數據進行Base64加密。

public enum UnityWebRequestType
{
    POST,
    GET
}

    /// <summary>
    /// 發送HTTP數據
    /// </summary>
    /// <param name="type">請求類型</param>
    /// <param name="url">請求地址</param>
    /// <param name="jsonData">傳輸的數據</param>
    /// <param name="sendBase64">發送數據是否需要Base64加密</param>
    /// <param name="getBase64">獲取數據是否需要Base64加密</param>
    /// <param name="failureCallBack">失敗回調</param>
    /// <param name="successCallBack">成功回調</param>
    /// <param name="otherHeaderName">額外添加的頭名稱</param>
    /// <param name="otherHeaderValue">額外添加的頭值</param>
    public void SendHttpMessage(UnityWebRequestType type, string url, string jsonData, bool sendBase64, bool getBase64, UnityAction failureCallBack, UnityAction<string> successCallBack, string[] otherHeaderName, string[] otherHeaderValue)
    {
        StartCoroutine(WebRequest(type, url, jsonData, sendBase64, getBase64, failureCallBack, successCallBack, otherHeaderName, otherHeaderValue));
    }

    private IEnumerator WebRequest(UnityWebRequestType type, string url, string jsonData, bool sendBase64, bool getBase64, UnityAction failureCallBack, UnityAction<string> successCallBack, string[] otherHeaderName, string[] otherHeaderValue)
    {
        Debug.Log(type.ToString() + "\t" + url + "\t" + jsonData);
        if (sendBase64)
        {
            jsonData = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonData));
        }
        byte[] body = Encoding.UTF8.GetBytes(jsonData);


        UnityWebRequest unityWeb = new UnityWebRequest(@url, type.ToString());
        unityWeb.uploadHandler = new UploadHandlerRaw(body);
        unityWeb.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
        //unityWeb.SetRequestHeader("Authorization", "Bearer " + token);
        if (otherHeaderName != null)
        {
            for (int i = 0; i < otherHeaderName.Length; i++)
            {
                unityWeb.SetRequestHeader(otherHeaderName[i], otherHeaderValue[i]);
            }
        }
        
        unityWeb.downloadHandler = new DownloadHandlerBuffer();
        yield return unityWeb.SendWebRequest();

        if (unityWeb.isNetworkError || unityWeb.isHttpError)
        {
            Debug.LogError("UnityWebRequest 請求失敗:" + unityWeb.error);
            failureCallBack?.Invoke();
            yield break;
        }

        if (unityWeb.isDone)
        {
            string result = unityWeb.downloadHandler.text;
            if (getBase64)
            {
                byte[] c = Convert.FromBase64String(result);
                result = Encoding.UTF8.GetString(c);
            }          
            Debug.Log("UnityWebRequest 請求成功:" + result);
            successCallBack?.Invoke(result);
        }
    }

    /// <summary>
    /// 發送表單數據
    /// </summary>
    /// <param name="url">請求地址</param>
    /// <param name="fromKey">表單Key數據</param>
    /// <param name="fromValue">表單Value數據</param>
    /// <param name="sendBase64">發送數據是否需要Base64加密</param>
    /// <param name="getBase64">獲取數據是否需要Base64加密</param>
    /// <param name="failureCallBack">失敗回調</param>
    /// <param name="successCallBack">成功回調</param>
    public void SendHttpMessageByForm(string url, string[] fromKey, string[] fromValue, bool sendBase64, bool getBase64, UnityAction failureCallBack, UnityAction<string> successCallBack)
    {
        StartCoroutine(WebRequestFrom( url, fromKey, fromValue, sendBase64, getBase64, failureCallBack, successCallBack  ));
    }

    private IEnumerator WebRequestFrom( string url,string[] fromKey, string[] fromValue ,bool sendBase64, bool getBase64, UnityAction failureCallBack, UnityAction<string> successCallBack)
    {
        WWWForm form = new WWWForm();
        if (fromKey != null)
        {
            for (int i = 0; i < fromKey.Length; i++)
            {
                if (sendBase64)
                {
                    fromValue[i] = Convert.ToBase64String(Encoding.UTF8.GetBytes(fromValue[i]));
                }
                Debug.Log("表單添加字段:" + fromKey[i] + "\t" + fromValue[i]);
                form.AddField(fromKey[i], fromValue[i]);
            }
        }
        UnityWebRequest unityWeb = UnityWebRequest.Post(@url, form);

        unityWeb.downloadHandler = new DownloadHandlerBuffer();
        yield return unityWeb.SendWebRequest();

        if (unityWeb.isNetworkError || unityWeb.isHttpError)
        {
            Debug.LogError("UnityWebRequest 請求失敗:" + unityWeb.error);
            failureCallBack?.Invoke();
            yield break;
        }

        if (unityWeb.isDone)
        {
            string result = unityWeb.downloadHandler.text;
            if (getBase64)
            {
                byte[] c = Convert.FromBase64String(result);
                result = Encoding.UTF8.GetString(c);
            }
            Debug.Log("UnityWebRequest 請求成功:" + result);
            successCallBack?.Invoke(result);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章