UnityWeb端和Js互调(MQTT通讯篇)

@TOC关于Unity与Js互调(MQTT通讯篇)踩了很多坑接下来总结一下

总体思路

工程项目当时是PC端项目转成Web端项目。PC端采用的通讯方式是MQTT通讯订阅端,而如果发布成Web端的话不能直接进行MQTT通讯,就想了个办法通过Unity与JS互调的的方法,通过JS写MQTT订阅端接收消息,然后再调用Unity已经写好接收消息的方法,最后完成信息实时接收(消息大约1秒一次)。

说说自己遇到几个问题

1.自己用的Unity2020.3.4版本,通过Js去调用Unity方法。

因本人确实不懂JS,导致始终调用不到,搜索网上的方法也没试成功,就只能自己一步一步去排查。到最后找到一个帖子,就是讲解的调用问题(https://forum.unity.com/threads/unity-2020-1-sendmessage-no-longer-works-help.842209/#post-6280073),如果最后尝试不行的话,可以使用我这种方法。以下代码是发布web端之后的index.html文件中代码(这是部分代码截图,完整代码已经放在下面了),打开以后你找到此处代码

在已经发布出文件脚本中,声明一下UnityInstance(window.unityInstance=null;),然后给UnityInstance赋值事件中的Unity Instance(window.unityInstance=unityInstance;), 通过这样再引用。前面写的两行只是为了给调用做铺垫,下面图片是使用SendMessage方法调用Unity写好的方法。

只要在JS脚本规定的格式中怎么用都可以。
Unity中被调用的方法
关于SendMessage(“Unity场景中物体”,“物体上脚本中函数名称(此处是接收消息的方法)”,被传入的参数)如果还是不明白就找找类似的帖子。这样就解决了JS调用Unity方法的问题。

2. MQTT通讯部分(JS部分)

如果你没有会JS的同事而你也不会JS那就有点难受咯,为啥子这样说尼?因为要用JS写通讯哦,不过也没事,看到此贴乃是我们的缘分,我会把引用的文件放在帖子里,好了正文开始了。。。。
下载好我帖子中的文件(里面包含三个.Js文件)放在已经发布完的Unity项目文件夹下面
Js文件
接下来还是打开“Index.html”脚本,在脚本最上边你会看到以下图片上内容,然后再去引用.js文件
在这里插入图片描述
(我同事说好像引用一个就可以,我也没测试到底引用哪一个,后续你们测试出来给我底下评论下)
以上都做完的话,剩下就通讯就可以了(一定要和发布端对好Ip和端口号!!!!)

这个地方要着重说一下,如果还是测不通 了解一下“ws”和“wss”然后和发布端一起对一下。测试方面的话可以用这个帖子(https://blog.csdn.net/qq_17627195/article/details/127301964?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167843521816800222821542%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167843521816800222821542&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~hot_rank-11-127301964-null-null.142v73pc_search_v2,201v4add_ask,239v2insert_chatgpt&utm_term=JS%20MQtt&spm=1018.2226.3001.4187)
写到这就差不多了,如果还是不通,莫慌 可能是细节方面出现了问题。
还有发布UnityWeb端的话应Build And Run 本地环境测试一下,看报错的话Ctrl+Shift+I 里面会有出现的错误。下面我放一下“index.html”脚本代码

<!DOCTYPE html>
<html lang="en-us"><head><meta charset="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Unity WebGL Player | Lng_2.0.2</title><link rel="shortcut icon" href="TemplateData/favicon.ico"><link rel="stylesheet" href="TemplateData/style.css"><script src="./jquery-3.5.1.js"></script><script src="./sockjs.min.js"></script><script src="./stomp.js"></script></head><body><div id="unity-container" class="unity-desktop"><canvas id="unity-canvas" width=960 height=600></canvas><div id="unity-loading-bar"><div id="unity-logo"></div><div id="unity-progress-bar-empty"><div id="unity-progress-bar-full"></div></div></div><div id="unity-warning"> </div><div id="unity-footer"><div id="unity-webgl-logo"></div><div id="unity-fullscreen-button"></div><div id="unity-build-title">Lng_2.0.2</div></div></div><script>var container = document.querySelector("#unity-container");var canvas = document.querySelector("#unity-canvas");var loadingBar = document.querySelector("#unity-loading-bar");var progressBarFull = document.querySelector("#unity-progress-bar-full");var fullscreenButton = document.querySelector("#unity-fullscreen-button");var warningBanner = document.querySelector("#unity-warning");// Shows a temporary message banner/ribbon for a few seconds, or// a permanent error message on top of the canvas if type=='error'.// If type=='warning', a yellow highlight color is used.// Modify or remove this function to customize the visually presented// way that non-critical warnings and error messages are presented to the// user.function unityShowBanner(msg, type) {function updateBannerVisibility() {warningBanner.style.display = warningBanner.children.length ? 'block' : 'none';}var div = document.createElement('div');div.innerHTML = msg;warningBanner.appendChild(div);if (type == 'error') div.style = 'background: red; padding: 10px;';else {if (type == 'warning') div.style = 'background: yellow; padding: 10px;';setTimeout(function() {warningBanner.removeChild(div);updateBannerVisibility();}, 5000);}updateBannerVisibility();}var buildUrl = "Build";var loaderUrl = buildUrl + "/WebGLTest.loader.js";var config = {dataUrl: buildUrl + "/WebGLTest.data.gz",frameworkUrl: buildUrl + "/WebGLTest.framework.js.gz",codeUrl: buildUrl + "/WebGLTest.wasm.gz",streamingAssetsUrl: "StreamingAssets",companyName: "DefaultCompany",productName: "Lng_2.0.2",productVersion: "0.1",showBanner: unityShowBanner,};// By default Unity keeps WebGL canvas render target size matched with// the DOM size of the canvas element (scaled by window.devicePixelRatio)// Set this to false if you want to decouple this synchronization from// happening inside the engine, and you would instead like to size up// the canvas DOM size and WebGL render target sizes yourself.// config.matchWebGLToCanvasSize = false;if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) {container.className = "unity-mobile";// Avoid draining fillrate performance on mobile devices,// and default/override low DPI mode on mobile browsers.config.devicePixelRatio = 1;unityShowBanner('WebGL builds are not supported on mobile devices.');} else {canvas.style.width = "960px";canvas.style.height = "540px";}loadingBar.style.display = "block";window.unityInstance=null; // 后来添加的var script = document.createElement("script");script.src = loaderUrl;script.onload = () => {createUnityInstance(canvas, config, (progress) => {progressBarFull.style.width = 100 * progress + "%";}).then((unityInstance) => {window.unityInstance=unityInstance; //后来添加的loadingBar.style.display = "none";fullscreenButton.onclick = () => {unityInstance.SetFullscreen(1);};}).catch((message) => {alert(message);});};document.body.appendChild(script);// MQTT通讯       var destination = "/topic/LNG.6FS";var onconnect = function (frame) {client.subscribe(destination, function (message) {window.unityInstance.SendMessage("Canvas", "CallJS_Message", message.body); //调用Unity 的方法  第三个是传入的参数console.log("打印:" + message.body);});} function ReturnValueFunction() {var url = "ws://10.17.51.103:61614/stomp"; // 端口号这一定要和后端对好,容易错。(因为C#那边MQTT连接是没有端口号的)var login = "admin";var passcode = "admin";  client = Stomp.client(url);     client.connect(login, passcode, onconnect);}//执行ReturnValueFunction();</script></body>
</html>

下面是文件链接(里面也有脚本)
链接:https://pan.baidu.com/s/1K9S88m6jPGNf4pEiYJfckw
提取码:8rjk

如果后续还有问题可以加我Q 1497132865

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45278.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity Houdini插件编写data Table传递数据给Houdini

上次说到Unity Houdini插件将Tag设为group&#xff0c;里面用到了自定义输入接口。然后那个Houdini教程又给我出难题了&#xff0c;unreal 可以用一种叫data Table的数据结构来完成向Houdini结构化数据的传递&#xff08;链接&#xff09;&#xff0c;我没找到Unity类似的功能&…

【Unity】动态生成圆环体Mesh

代码由ChatGPT生成&#xff0c;后经人工调整。 /// <summary> /// 创建一个3维圆环体Mesh。 /// </summary> /// <param name"outerRadius">外半径。</param> /// <param name"innerRadius">内半径。</param> /// <…

关于vsCode中文插件突然无效的解决办法

今天今天github上下载了一个devtools 用vsCode打开,发现中文插件无效了 解决办法: 按ctrlshiftp 输入Configure Display Language 在弹出的语言中&#xff0c;选中zh-cn 然后重启vsCode

Android的EditText超出字数限制,给用户提示

Android的EditText超出字数限制&#xff0c;给用户提示 导语 如果项目着急使用&#xff0c;直接将下面代码复制到项目中&#xff0c;当做自定义的EditText使用就可以了。 建议将后面的解决思路看一遍&#xff0c;增强自己阅读源码的能力。 自定义的MaxLengthEditText /*** C…

最好理解的,用jeecms搭建一个新闻发布网站

1 前期环境配置 首先需要有jdk、tomcat和mysql&#xff0c;这里对于不同的jeecms版本对以上三种要求是不同的&#xff0c;我本人用的是jdk1.8&#xff0c;tomcat7,mysql5的版本。我们这里需要将从官网下载的压缩包解压出的ROOT文件放入tomcat下面的webapp下&#xff0c;替换掉…

一粒云之钉钉集成

一粒云dingtalk集成- 文章目录 一粒云dingtalk集成-1、一粒云管理后台配置步骤&#xff1a;2、钉钉管理后台配置步骤&#xff1a;2.1、自建应用2.3、填好对应的信息&#xff0c;下一步2.4、申请开通所有的权限——选择全部员工2.5、基础信息->查看详情&#xff0c;获得appke…

YLBs CAPTCHA - 签到题_N种花式签到,任你活动千万场,总有一款适合你

数字化时代&#xff0c;科技办会的理念正在逐步深入每个主办方的心里&#xff0c;如何给参会嘉宾带去好的参会体验&#xff1f;如何在众多的签到方式中找到适合自己活动的签到&#xff1f;31会议给你几款花样签到方式&#xff0c;让你的大会科技感十足。 二 / 微 / 码 / 签/ 到…

Ai配音专家 免费配置教程(适用于mac和windows系统)

Ai配音专家 语音转文字免费配置教程&#xff08;适用于mac和windows系统&#xff09; 推荐一款免费文本转语音的软件&#xff0c;文件来源于github&#xff0c;如果你在做自媒体的时候也不想用真音&#xff0c;那这款软件绝对适合你。配置过程分为以下内容&#xff1a; Ai配音…

vue前端使用Jenkins自动构建项目,保姆级教程

1. 开始前的准备工作 1台服务器&#xff0c;1个镜像仓库&#xff0c;安装docker 练习的话&#xff0c;服务器可以在[阿里云上](https://www.aliyun.com/?spm5176.ecscore_.top-nav.dlogo.509a4df5JhX1PN)领取一个月免费ECS云服务器&#xff0c;如下图在阿里云控台界面搜索容器…

vue 3.x 中使用ele-image时相对路径的图片加载失败

参考文档&#xff1a; https://element.eleme.cn/#/zh-CN/component/installation 环境: Mac OS X 10.12 [zcmele 2]$node -v v12.6.0 [zcmele 3]$npm -v 6.9.0 [zcmele 4]$cnpm -v cnpm6.1.0 (/usr/local/lib/node_modules/cnpm/lib/parse_argv.js) npm6.10.2 (/usr/local/li…

创意3D立体logo设计难不难?怎么设计?

本文由:“学设计上兔课网”原创,图片素材来自网络,仅供学习分享 创意3D立体logo设计难不难?怎么设计?虽然是3D的效果,但是我们也可以通过平面设计软件AI或者PS软件来实现这种伪3D的视觉效果。首先我们来看一看做完的最终效果 1.多边形工具,填充为0,有描边。利用多边形…

PR开场片头模板创意立体3D动态logo展示pr模板

&#xff0c; PR开场片头模板 创意立方体3Dlogo展示pr模板 这是一个整洁和动态动画的Premiere Pro模板&#xff0c;带有一个旋转立方体&#xff0c;时尚地旋转以显示您的媒体。包含1个标志占位符和1个文本占位符。简单介绍您的演示文稿&#xff0c;幻灯片&#xff0c;电视节目…

3D logo制作

3D制作图片 这次用AI来制作3Dlogo,首先把一张立体形状的logo图导入AI里 使用钢笔工具先把侧面白色部分抠下来 像上图一样抠下来之后在菜单里点击效果3D然后选择凸起和斜角,为了更好的去调整3D图形的变化,先点击预览调整凸出厚度数值为482pt,然后再去调整上面的方向环绕…

C4D暑期计划打卡7.30(2)

完成logo破碎小动画跟做 为完成的logo主体添加材质、增加天空、摄像机目标、对主体内部集进行单独材质添加&#xff0c;渲染增加景深&#xff0c;增添变化。 四视图 透视图 渲染图1 渲染图2

修改mars3d内置的文字

在使用mars3d开发中可能会需要修改内置的文字&#xff0c;如下图 mars3d内置的文字都会统一放在 mars3d.lang 这个对象下管理。如下图 如果需要修改&#xff0c;可以使用如下的方式 mars3d.Lang["_单击完成绘制"][0] "单击完成绘制&#xff0c;右键取消绘制&q…

CSS之 2D转换---3D转换(内含过渡)

转换可以实现元素的位移、旋转、缩放等效果 2D转换 translate --- 移动rotate --- 旋转scale --- 缩放 1.translate 语法&#xff1a;(px) transform:translate(x,y); transform:translateX(n); transform:translateY(n); 不会影响其他元素的位置 &#xff08;会变成前后…

chatgpt赋能python:Python的文件导出功能

Python的文件导出功能 作为一种流行的编程语言&#xff0c;Python 提供了广泛的文件导出功能&#xff0c;方便了开发者的日常工作。在本文中&#xff0c;我们将分享如何使用 Python 导出.py 文件&#xff0c;以及如何最大程度地利用这个功能。 什么是.py 文件&#xff1f; 首…

月薪2万,被新同事15秒气走。

今年&#xff0c;AIGC掀起了巨浪&#xff0c;身边不少人感到前所未有的焦虑&#xff1a; 朋友圈好友晒出的AI美图&#xff0c;仅需15秒&#xff0c;竟比我2周的设计更出色&#xff1b; 公司用AI写的文案&#xff0c;转化率提升了10%&#xff0c;可能要优化人员了; 职场危机提前…

AIGC制作的“视觉大片”走红!耗时仅3天,首批玩家吃到“红利”了

3月26日&#xff0c;2023山东省旅游发展大会在青岛拉开帷幕,当天&#xff0c;一条动画小视频惊艳了现场所有人&#xff0c;这条视频很快登上了“学习强国”、微博等社交媒体平台。视频名为《AI眼中的崂山四季》&#xff0c;108秒&#xff0c;呈现了青岛崂山大约十个特色“网红打…

Midjourney注册教程

Midjourney 太火了&#xff01;无论你是画师、设计师&#xff0c;还是淘宝电商等&#xff0c;都不得不熟悉并利用这种超级牛逼的 AI 绘图工具&#xff0c;不然真的保不定哪天就被淘汰了&#xff01; Midjourney 怎么玩&#xff1f;相信很多小白还不清楚&#xff01;这不巧了么…