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