Unity3D开发之unity和js通信交互
自己虽然最开始弄的就是webgl但是一直比ios和安卓记录的都要晚,因为一直没想到,所以这里结合某个博客加上自己的经历记录一下
关于Unity在WebGL平台的特性和交互 可以参考官方文档
一.老版方法
unity发布webplayer平台后会输出html和unity3d文件。我们的程序主要被打包在unity3d文件里,而html则是网页的界面显示,webPlayer已经被弃用了,鉴于一些公司可能旧项目依然使用这个平台,这里就保留这部分解释。
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#主动通信前端的中间方法,我们在里面增加我们要接受c#传来的数据和js要调用的函数。代码如下:
mergeInto(LibraryManager.library, {//这里是代码1JSLog: function (str) {var strs=Pointer_stringify(str);//这个Log方法是前端那边写的方法Log(strs);},//这里可以添加若干个方法,方法之间记得用逗号隔开,//否则WebGL平台打包的时候会报错
});
注意:这里一定要用unity内置函数Pointer_stringify将传进来的str转换成字符串。如果不转换str存储的是内存地址位。传到js就是一堆数字。最后保存文件,将文件放到unity工程下的Plugins文件夹内。
然后在c#代码块里,我们加上我们要调用的方法:
[DllImport("__Internal")]private static extern void JSLog(string str);//此处传入的类型和调用时候传入的数据类型一定要一致void Start(){//如果有返回值,可以定义变量接收返回值JSLog("666");}
最后使我们打包出来的html文件里,在scrip块内加入jslib的JSLog里面被调用的函数Log:
function Log(str){console.log(str);;gameInstance.SendMessage('Main Camera','GetStr',String(str));}
在jslib的方法里面,如果调用前端的方法后有字符串返回 则需要这样写,字符串才能返回到c#里面
//获取服务器访问的认证 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;},
前端调用的时候是这样的
this.gameInstance.SendMessage('OutSideInteractor', 'ReceiveDlteAddedProduct ', id)
其中 this.gameInstance是unity webgl平台出包后的文件夹里面的index.html的gameInstance对象,下面是index.html里面定义的内容,前端调用Unity的代码也可以写到这里,但更多是写到前端自己的某个脚本里面
var gameInstance = UnityLoader.instantiate("gameContainer", "Build/CPWEBGL.json", { onProgress: UnityProgress })
window.ReceiveAddSceneItemStr = function (e) {gameInstance.SendMessage('OutSideInteractor', 'ReceiveAddSceneItemStr', e)}
SendMessage方法第一个是场景里面的物体名字,第二个是物体所挂脚本里面的某个方法名字,第三个参数是参数,要注意的是,即使前两个写对了,如果第三个参数没传对,也会报错说找不到方法
这里的CPWEBGL是我打webgl包的最后一个文件夹的名字,生成的json和unityLoad文件的文件名字与这个名字相同,unityLoad文件是Unity的主要内容的存放文件,这个名字一般要和前端约定好,因为前端加载Unity文件的时候会写死一个名字,双方的名字不同的时候会出现问题。具体参考 Unity WebGL错误集锦
index.html可以在unity的编辑器的Aseet文件夹下面的WebGLTemplates里面定义好,用于自定义WebGL加载画面
具体过程可以百度WebGLTemplates
或者这里有一篇比较好的参考 【Unity3D日常开发】Unity3D模板 WEBGL模板 自定义Templates 使用教程
Unity3D开发之unity和js通信交互相关推荐
- unity android屏幕自适应,Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据。兼容android和ios...
本文将带你了解Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据.兼容android和ios,希望本文对大家学Android有所帮助. 跨平台并自适应显示摄像头数据新建工程并 ...
- (0085)iOS开发之OC与JS交互高级用法(JavaScriptCore)
前述:JavaScriptCore你不知道的OC与JS之间交互.OC与JS之间用model实现交互.通讯.传值!好玩! 几乎三年来一直断断续续接触OC与JS交互,每次觉得UIWebView OC与JS ...
- Unity开发之-Unity入门简介(近万字攻略)
前言 大家好,我是一个Unity的程序员,从这篇开始我会持续更新学习Unity的基本,去帮助想要学习unity的小伙伴,有兴趣的同学可以跟着我一起学习Unity,下面,我们将要开始了解Unity以及想 ...
- Android开发之android与JS互调 | Android与H5互调(附源码)
我们先看下JS代码: <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...
- [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...
- Unity与Android通信交互
版本 Unity2019.3以上 Android 3.4以上 前言 UnityPlayerActivity找不到!UnityPlayerActivity找不到!UnityPlayerActivity找 ...
- iOS开发之Objective-C与JavaScript的交互
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...
- OS开发之Objective-C与JavaScript的交互
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...
- iOS开发之Unity游戏在iOS平台运行调研(踩坑)
需求 在现有App上运行自研的Unity游戏 注:此需求可能会由于一些原因而弃掉 方案 方案一.导出WebGL运行在WKWebView上(方案不适用) 结论: 不建议采用:不建议深挖 移动端网页仅适用 ...
- Android开发之Service与Activity数据交互(源代码分享)
Service想要与Activity进行数据交互,首先Activity先得绑定Service.bound service是service 的实现,它允许其他应用程序绑定到它并与之交互.要提供bound ...
最新文章
- Rocksdb 的优秀代码(三)-- 工业级 线程池实现分享
- canny算子的运用
- 电子设计基础——电源的各项指标及测量方法
- 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task5模型融合
- 重磅大礼!100本《机器学习》by周志华,免费送!
- Leetcode每日一题:290.word-pattern(单词规律)
- ajax 循环php数组,jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
- PLSQL developer的使用
- android手机运行win10,兼容安卓 Win10手机竟然能直接运行APK
- python+selenium从excel读取成语到谷歌搜索得到搜索结论数
- Unity中通过ButtonClicked更换GameOgject纹理图片
- 服务器防御DDoS的方法,一文解决DDoS攻击
- Serverless 极致弹性解构在线游戏行业痛点
- kNN实现手写数字识别
- html数据线如何使用,揭秘数据线DIY详细步骤
- Python尝试给扫描件添加自然阴影
- 设位于第一象限的曲线y=f(x)上的任一点P(x,y)的切线在x轴上的截距等于该点发现在y轴上截距的相反数,且曲线经过(1,0),求该曲线
- Anchor Free系列模型11
- C#几行代码实现定时关机/重启 超详细(建议新手练习)
- CPU/GPU/GPGPU简介