官方文档:【传送门】
【说明】:最近开发WEBGL平台上的项目,很多时候我们需要在Unity中调用网页端的方法而不是在Unity内部调用,比如场景中点击音效(为了减少打包包体大小采取了在网页上播放音效),点击按钮跳转新的场景等等等等应用场景。
WEBGL平台下【Unity中调用JS上的方法】
首先创建一个后缀为`.jslib`的文件测试代码如下,放置在Assets文件夹下的Plugins文件夹下。
mergeInto(LibraryManager.library, {
UnityToJs_Simple: function (msg) {
// unityMsg_Simple方法需要在打包出来的index.html中的声明
//这里使用Pointer_stringify方法转换unity传递过来的字符串
unityMsg_Simple(Pointer_stringify(msg));
},
Hello:function(){
window.alert("Hello World!");
},
//方法之间一定要用逗号隔开
//执行JS方法并返回一个string类型的文本
StringReturnValueFunction: function () {
var returnStr = "bla";
var bufferSize = lengthBytesUTF8(returnStr) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(returnStr, buffer, bufferSize);
return buffer;
},
});
C#脚本
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
//测试JS与Unity互相传值
public class TestJS : MonoBehaviour
{
public Text text_Txt;
[DllImport("__Internal")]
private static extern void Hello();
[DllImport("__Internal")]
private static extern string StringReturnValueFunction();
void Update()
{
if (Input.GetKeyDown(KeyCode.Q))
{
text_Txt.text += StringReturnValueFunction();
}
else if (Input.GetKeyDown(KeyCode.T))
{
Hello();
}
}
public void Test(string str)
{
text_Txt.text += str;
}
}
创建一个文本组件,就可以打包测试了,界面自己搭就可以了。
WEBGL平台下【JS调用Unity中的方法】
API:unityInstance.SendMessage(objectName, methodName, value);
其中objectName是场景中对象的名称;methodName是脚本中方法的名称,当前附加到该对象;value可以是字符串、数字,也可以为空。
这需要在打包后在index.html界面上自己定义
找到打包后这段代码,一定要注意形参的要求,
C#中的代码挂载到Canvas上
运行结果:
点击右下角最大化的按钮,发现已经js已经调用unity中的方法显示出来了,没有完全显示是因为用的字体经过了处理只有常用字体。
最后几点需要注意:
- webgl平台默认字体不显示中文,需要自己换一个字体;
- 在打包出来的index.html网页,unity.Instance 在 2020.1 中替换为 createUnityInstance;
- 2019.1 中的 WebGL 实例从 gameInstance 重命名为 unityInstance;