Unity WebGL交互通信
Unity 调用 H5
本文使用的 unity 版本为:2021.3.3
1.在unity中通过c#的特性DllImport导出外部实现函数
[DllImport("__Internal")]
private static extern void callJsString(string param);
[DllImport("__Internal")]
private static extern void callJsInt(int param);
[DllImport("__Internal")]
private static extern void callJsFloat(float param);
[DllImport("__Internal")]
private static extern void callJsBoolean(bool param);
2.在unity的Plugins文件夹(没有则创建一个)里面创建一个后缀为.jslib的文件
3.在xxx.jslib文件中实现函数,如下
mergeInto(LibraryManager.library, {
callJsString: function (param) {
console.log(Pointer_stringify(param));
},
callJsInt: function (param) {
console.log(param);
},
callJsFloat: function (param) {
console.log(param);
},
callJsBoolean: function (param) {
console.log(param);
},
});
注意: 使用传参字符串的时候,使用Pointer_stringify转下字符串,否则可能会报错或者乱码
4.如果想要调用.js里面的接口或者.html里面的方法,可以通过往window里面注册函数进行调用的方式
例如:在index.html里面注册函数 window.httpPost = httpPost;
<script>
function httpPost(url, params) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)) {
let data = xhr.response;
console.log("Status: " + xhr.status + " " + xhr.statusText + " data: " + data);
success(data);
}
else if (xhr.status >= 400) {
console.log("Status: " + xhr.status + " " + xhr.statusText);
fail(xhr.status, xhr.statusText)
}
}
console.log("Status: Send Post Request to " + url);
xhr.open("POST", url, true);
//xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
xhr.setRequestHeader("Content-Type", "application/json");
xhr.timeout = 10000;
xhr.send(params);
}
window.httpPost = httpPost;
</script>
5.可以在xxx.jslib文件中调用index.html里面的httpPost函数,当时也可以直接把函数实现直接放在xxx.jslib文件中
mergeInto(LibraryManager.library, {
callJsString: function (url,params) {
window.httpPost(Pointer_stringify(url),Pointer_stringify(params));
},
});
6.上面的方式可以让我们在案例httpPost调用其他位置的.js代码或者其他位置的插件
H5调用 Unity
1.这里的方式主要是在index.html文件中在创建unityInstance的时候通过缓存unityInstance并向unityInstance发送消息的方式实现
2.在index.html中创建unityInstance的时候缓存unityInstance
这里通过:window.unityInstance = unityInstance; 缓存了unityInstance实例
var script = document.createElement("script");
script.src = loaderUrl;
script.onload = () => {
createUnityInstance(canvas, config, (progress) => {
progressBarFull.style.width = 100 * progress + "%";
}).then((unityInstance) => {
loadingBar.style.display = "none";
fullscreenButton.onclick = () => {
unityInstance.SetFullscreen(1);
};
window.unityInstance = unityInstance;
}).catch((message) => {
alert(message);
});
};
3.向unity发送消息
gameobjectName:接收消息的gameobject名
funcName:方法名
param:参数,字符串,可以传json
function sendUnityMessage(gameobjectName,funcName,param)
{
if(window.unityInstance)
{
window.unityInstance.SendMessage(gameobjectName,funcName,param);
}
}