Unity3D开发之unity和js通信交互

廉价感情. 提交于 2020-03-11 02:30:54

自己虽然最开始弄的就是webgl但是一直比ios和安卓记录的都要晚,因为一直没想到,所以这里结合某个博客加上自己的经历记录一下

一.老版方法

unity发布webplayer平台后会输出html和unity3d文件。我们的程序主要被打包在unity3d文件里,而html则是网页的界面显示。

1.Unity发送消息给JS

unity想要和js交互,提供了一个函数:Application**.ExternalCall()**;此函数仅限于webplayer平台下。我们编辑发布的html文件,在里面加入我们的js脚本如下:

function GetID(id)
{
   alert("传入id:"+id);	
}

在unity里我们在start函数里调用

Application.ExternalCall("GetID","吴彦祖");

使用浏览器打开html文件,就会出现如下弹窗:

在这里插入图片描述

2.JS发送消息给unity

我们在刚才的js函数里添加一句代码:

	function GetID(id)
	{
		alert("传入id:"+id);
//发送消息给unity 第一个参数:挂在脚本的物体 第二个参数:unity被调用的函数 第三个参数:函数传入的参数
		u.getUnity().SendMessage("Main Camera","GetIDInfo","JayW")
	}

在unity里创建一个函数用来接收处理:

public void GetIDInfo(string id)
    {
        text.text = id;
    }

运行效果如下:
在这里插入图片描述

二.新版方法

最近在使用webgl方面,2018.2.9版本弃用了Application.ExternalCall方法。选择添加一个jslb文件作为中间层。我们搜官方文档可以看到使用方式如下:

首先创建一个文本,文件格式保持为.jslib。然后我们在里面增加我们要接受c#传来的数据和js要调用的函数。代码如下:

mergeInto(LibraryManager.library, {
 //代码1
  JSLog: function (str) {
  var strs=Pointer_stringify(str);
    Console.Log(strs);
  },
});

注意:这里一定要用unity内置函数Pointer_stringify将传进来的str转换成字符串。如果不转换str存储的是inptr数据的内存地址位。传到js就是一堆数字。最后保存文件,将文件放到unity工程下的Plugins文件夹内。

然后在c#代码块里,我们加上我们要调用的方法:

    [DllImport("__Internal")]
    private static extern void JSLog(string str);//此处传入的类型和调用时候传入的数据类型一定要一致
 
 
	void Start()
	{
        JSLog("卧槽你大爷");
    }

最后使我们打包出来的html文件里,在scrip块内加入被调用函数:

 function Log(str)
	  {
	  console.log(str);;
	  gameInstance.SendMessage('Main Camera','GetStr',String(str));
	  }

如果是前端传进来的字符串 则需要这样写

//获取服务器访问的认证 
	getServerAuth: function(){
		var token = window.THREE_TOKEN();
    	console.log("jslib getServerAuth token " + token);
        
    	var bufferSize = lengthBytesUTF8(token) + 1;
        var buffer = _malloc(bufferSize);
        stringToUTF8(token, buffer, bufferSize);
        return buffer;
    },

这段代码和代码1一起放到xxx.jslib脚本下,这个脚本放置在Plugins文件夹内,前端调用的时候是这样的

this.unity.SendMessage('OutSideInteractor', 'ReceiveDlteAddedProduct ', id)

其中 this.unity是unity的webgl平台出包后的文件夹里面的index.html的gameInstance对象

var gameInstance = UnityLoader.instantiate("gameContainer", "Build/CPWEBGL.json", { onProgress: UnityProgress })
window.ReceiveAddSceneItemStr = function (e) {
        gameInstance.SendMessage('OutSideInteractor', 'ReceiveAddSceneItemStr', e)
    }

这里的CPWEBGL是我打webgl包的最后一个文件夹的名字,生成的json与这个名字相同
index.html可以unity的编辑器的Aseet文件夹下面的WebGLTemplates里面定义好,用于自定义WebGL加载画面
具体过程可以百度WebGLTemplates
值得注意的是jslib里面
不支持这种写法,如果这样写了小心报错, jslib里面的每个方法之间需要用英文的逗号隔开

SendMessage方法第一个是场景里面的物体名字,第二个是物体所挂脚本里面的某个方法名字,第三个参数是参数,要注意的是,即使前两个写对了,如果第三个参数没传对,也会报错说找不到方法
如果前端调用unity的方法找不到的时候

mergeInto(LibraryManager.library, {
 //代码1
  JSLog: function (str) {
    Console.Log(Pointer_stringify(strs));
  },
});
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!