Unity中WEBGL平台下【Unity中调用JS上的方法】【JS调用Unity中的方法】

官方文档:传送门
【说明】:最近开发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中的方法显示出来了,没有完全显示是因为用的字体经过了处理只有常用字体。
在这里插入图片描述

最后几点需要注意:

  1. webgl平台默认字体不显示中文,需要自己换一个字体;
  2. 在打包出来的index.html网页,unity.Instance 在 2020.1 中替换为 createUnityInstance;
  3. 2019.1 中的 WebGL 实例从 gameInstance 重命名为 unityInstance;

猜你喜欢

转载自blog.csdn.net/weixin_44446603/article/details/122377772