自己虽然最开始弄的就是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通信交互相关推荐

  1. unity android屏幕自适应,Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据。兼容android和ios...

    本文将带你了解Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据.兼容android和ios,希望本文对大家学Android有所帮助. 跨平台并自适应显示摄像头数据新建工程并 ...

  2. (0085)iOS开发之OC与JS交互高级用法(JavaScriptCore)

    前述:JavaScriptCore你不知道的OC与JS之间交互.OC与JS之间用model实现交互.通讯.传值!好玩! 几乎三年来一直断断续续接触OC与JS交互,每次觉得UIWebView OC与JS ...

  3. Unity开发之-Unity入门简介(近万字攻略)

    前言 大家好,我是一个Unity的程序员,从这篇开始我会持续更新学习Unity的基本,去帮助想要学习unity的小伙伴,有兴趣的同学可以跟着我一起学习Unity,下面,我们将要开始了解Unity以及想 ...

  4. Android开发之android与JS互调 | Android与H5互调(附源码)

    我们先看下JS代码: <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  5. [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究

    各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...

  6. Unity与Android通信交互

    版本 Unity2019.3以上 Android 3.4以上 前言 UnityPlayerActivity找不到!UnityPlayerActivity找不到!UnityPlayerActivity找 ...

  7. iOS开发之Objective-C与JavaScript的交互

    UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...

  8. OS开发之Objective-C与JavaScript的交互

    UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...

  9. iOS开发之Unity游戏在iOS平台运行调研(踩坑)

    需求 在现有App上运行自研的Unity游戏 注:此需求可能会由于一些原因而弃掉 方案 方案一.导出WebGL运行在WKWebView上(方案不适用) 结论: 不建议采用:不建议深挖 移动端网页仅适用 ...

  10. Android开发之Service与Activity数据交互(源代码分享)

    Service想要与Activity进行数据交互,首先Activity先得绑定Service.bound service是service 的实现,它允许其他应用程序绑定到它并与之交互.要提供bound ...

最新文章

  1. Rocksdb 的优秀代码(三)-- 工业级 线程池实现分享
  2. canny算子的运用
  3. 电子设计基础——电源的各项指标及测量方法
  4. 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task5模型融合
  5. 重磅大礼!100本《机器学习》by周志华,免费送!
  6. Leetcode每日一题:290.word-pattern(单词规律)
  7. ajax 循环php数组,jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
  8. PLSQL developer的使用
  9. android手机运行win10,兼容安卓 Win10手机竟然能直接运行APK
  10. python+selenium从excel读取成语到谷歌搜索得到搜索结论数
  11. Unity中通过ButtonClicked更换GameOgject纹理图片
  12. 服务器防御DDoS的方法,一文解决DDoS攻击
  13. Serverless 极致弹性解构在线游戏行业痛点
  14. kNN实现手写数字识别
  15. html数据线如何使用,揭秘数据线DIY详细步骤
  16. Python尝试给扫描件添加自然阴影
  17. 设位于第一象限的曲线y=f(x)上的任一点P(x,y)的切线在x轴上的截距等于该点发现在y轴上截距的相反数,且曲线经过(1,0),求该曲线
  18. Anchor Free系列模型11
  19. C#几行代码实现定时关机/重启 超详细(建议新手练习)
  20. CPU/GPU/GPGPU简介

热门文章

  1. 新版音乐网站系统源码Sourcecode
  2. eda多功能数字钟课程设计_EDA电子钟多功能数字时钟课程设计(含代码)[优秀]...
  3. Python--繁体中文与简体中文相互转换
  4. Ubuntu命令技巧
  5. KEmulator 屏蔽内存查看器功能
  6. 【牛腩】牛腩新闻发布系统总结
  7. bing翻译api php,PHP调用必应翻译API示例源码
  8. 猴子吃桃问题java思路_java编程题猴子吃桃问题答案
  9. Java项目——个人博客系统
  10. Java数据库的JDBC编程