网站首页 > 技术文章 正文
方案前情提要:
可视化方案,3D端使用unity的WebGL方案,图表那些则是Web前端实现。那么这个结构其实就是WebGL一层作为背景层,Web图表作为前景层。
碰到的特殊需求:点击背景层(WebGL)的3D物体,反馈数据给web前景层,动态改变Web图表的数据内容。
举例:3D场景中有100个摄像头,点击其中一个(第66个),反馈给web前端id:66,web前端拿到这个id,进行处理,打开编号为66的摄像头(海康/大华)的视频弹框。
方案实现:
1.unity端实现一个jslib文件预定义函数作为桥接。
2.c#使用DllImport引入和调用预定义的函数。
3.web端使用js定义被调用函数。
基于以上的原理制作了一个生成器
操作步骤:
1.在Unity中Project目录“Assets\Plugins"下,创建一个jslib文件,可以用txt创建文件,文件名加后缀名为“xxx.jslib”,切记后缀名更改为jslib
jslib当作中间者,unity与它通信,前端也与它通信,在此基础上三者之间进行了通信对接
2.在刚刚创建的jslib文件里,先来个简单的,添加以下代码:
mergeInto(LibraryManager.library, {
StartTime: function(){ //StartTime是Unity调用的方法名字
BeginTime(); //BeginTime是调用前端BeginTime()方法
},
});
3 .在unity中,新建一个脚本,添加命名空间using System.Runtime.InteropServices; 并添加以下C#代码:
[DllImport("__Internal")]
private static extern void StartTime();
在unity中调用StartTime()方法,即调用jslib里的StartTime()方法
4 .在unity打包程序后,在index.html中添加BeginTime()方法
以上是unity基础的向前端通信方式
接下来是进阶的使用,举些例子更好理解
例子一:
在Unity中向js传递字符串时需要在js中使用 Pointer_stringify(str) 进行转换。 以下是将unity端的学生成绩发送到前端
js端:
mergeInto(LibraryManager.library,{
PostScore: function (score,sceneName) {
strs = Pointer_stringify(sceneName);
GetScore(score,strs);
},
});
unity端:
[DllImport("__Internal")]
private static extern void PostScore(int currentScore, string currentScene); //当前分数,当前场景
html:
function GetScore(score,name){
console.log(score); //log出成绩测试是否成功
}
例子二:
在js中向Unity返回字符串的时候需要进行如下转换操作: var bufferSize = lengthBytesUTF8(returnStr) + 1; var buffer = _malloc(bufferSize); stringToUTF8(returnStr, buffer, bufferSize); return buffer; 以下为获取服务器ip返回到Unity端的例子
js端:
mergeInto(LibraryManager.library, {
GetIp: function(){
var returnStr = GetIPInformation();
var bufferSize = lengthBytesUTF8(returnStr) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(returnStr, buffer, bufferSize);
return buffer;
},
});
unity端:
[DllImport("__Internal")]
private static extern string GetIp();
private string m_IpStr= "";
void Start()
{
m_IpStr= GetIp();
}
将返回到unity的字符串接收一下就好。
html:
function GetIPInformation(){
var urlPath = window.document.location.href; //浏览器显示地址 http://10.15.5.83:5555/ISV/demo.aspx?a=1&b=2
var docPath = window.document.location.pathname; //文件在服务器相对地址 /ISV/demo.aspx
var index = urlPath.indexOf(docPath);
var serverPath = urlPath.substring(0, index);
console.log(serverPath);
return serverPath;
}
参考资料:Unity开发WebGL与前端之间如何通信互?
- 上一篇: 从零开始学习3D可视化之摄像机投影方式
- 下一篇: cesium.js神了,让3d地图变得惊艳无比
猜你喜欢
- 2024-11-27 cesium.js神了,让3d地图变得惊艳无比
- 2024-11-27 官方示例(十四)多线段开发3D场景测量标点距离ThingJS
- 2024-11-27 从零开始学习3D可视化之摄像机投影方式
- 2024-11-27 THREE.js:网页上的3D世界构建者
- 2024-11-27 nunustudio 基于threejs的web3d开源编辑器
- 2024-11-27 WebGL+Three.js 入门与实战,系统学习 Web3D 技术无密梅花含苞
- 2024-11-27 Three.js、Babylon.js 和 ClayGL:哪款Web3D引擎最适合你的项目?
- 2024-11-27 3D地图的开发离不开CesiumJs,效果超出你的想象。
- 2024-11-27 3D 世界的钥匙「GitHub 热点速览 v.22.08」
- 2024-11-27 无密分享Three.js企业3D可视化实战项目WEBGL系统体系课程
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)