赶上个Web平台的项目,许多方法Unity不能直接使用,需要与JS相互调用进行通信,比如webSocket,直接贴代码。 Unity调用JS: 需要先在工程目录下的Plugins文件夹内创建“__Internal.jslib”文件,内容如下:
mergeInto(LibraryManager.library, {
Hello: function () {
window.alert("Hello, world!");
},
ConnectMQTT: function () {
window.wsconnect();
},
SendMsgByMQTT: function (str) {
window.wsconnect();
},
});
unity工程创建脚本文件,内容如下:
public class UnityToWeb
{
[DllImport("__Internal")]
private static extern void Hello();
[DllImport("__Internal")]
private static extern void ConnectMQTT();
[DllImport("__Internal")]
private static extern void SendMsgByMQTT(string str);
public static void ToJSHello()
{
Hello();
}
public static void ToJSConnectMQTT()
{
ConnectMQTT();
}
public static void ToJSSendMsgByMQTT(string content)
{
SendMsgByMQTT(content);
}
}
JS调用Unity: Unity工程内代码如下:
public class WebToUnity : MonoBehaviour
{
private JSToUnityJsonData jsonDataReceive;
public void JsToUnity(string json)
{
Debug.Log(json);
}
}
修改打包后目录中的“index.html”文件
<!DOCTYPE html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Unity WebGL Player | ProductName</title>
<script src="Build/UnityLoader.js"></script>
<script>
var gameInstance = UnityLoader.instantiate("gameContainer", "Build/ProductName.json");
function JsToUnityString(content)
{
gameInstance.SendMessage("JSToUnity","JsToUnity",content);
}
</script>
</head>
<body>
<div id="gameContainer" style="width: 1920px; height: 1080px; margin: auto"></div>
</body>
</html>
经测试,发现JS调用Unity只支持传入一个参数,Int或者String,所以采用了Json格式的字符串处理多参数的情况。
我们的项目是把unity的Web端嵌入到了three.js中,然后JS调用Unity的时候测试了半天没效果,后来发现是程序焦点的问题,因为是多程序调用,所以需要先把程序焦点固定在unity上才会响应JS的调用方法,后来在打包的时候把允许后台运行的选项勾上了,解决了这个问题。
|