当前位置: 首页 > news >正文

unity楼层内摄像头模型设计碰撞点击、hover等功能及与web交互视频流显示全流程记录

一、Unity端开发

(1)楼层模型设计碰撞点击

在unity工程中依次点击左侧层级楼层内的摄像头模型----点击右侧检查器内的【添加组件】按钮----点击 Box Collider----在Box Collider组件内点击【编辑碰撞器】----调整碰撞器的四周位置,使得摄像头模型被碰撞器边界线完全包裹

image

image

 以上方法依次处理各个摄像头模型。

(3)编写碰撞体碰撞处理脚本

(3.1)

  在unity项目层级下的Scripts文件夹下新建脚本CameraColliderAndHover.cs;在脚本内部删除自动生成的void Start(),void Update()方法(用于该脚本用户处理hover事件和click事件,用不到帧相关操作);在脚本追加摄像头的基础属性配置信息

image

image

 (3.2)依次将脚本绑定到摄像头中,并填写摄像头基础属性信息

image

 (3.3)在unity项目层级下的Plugins下新建CameraHover&Click.jslib中间件文件,用于后续unity事件被监听后,调用中间件指定方法,再通过该方法内部调用web端暴露的js函数,实现unity--->web通信交互

 image

 (3.4)引入jslib中间件函数、编写C#脚本hover事件与点击事件的业务逻辑

CameraHover&Click.jslib中间件内部定义:

 1 mergeInto(LibraryManager.library, {
 2 //摄像头被hover时
 3     CameraBeHovering: function (cameraname, cameraip,x, y) {
 4         var cameraname = UTF8ToString(cameraname);
 5         var cameraip = UTF8ToString(cameraip);
 6 
 7         // 调用网页上暴露的全局方法
 8         if (window.ShowCameraTooltip) {
 9             window.ShowCameraTooltip(cameraname, cameraip,x, y);
10         }
11     },
12 //摄像头被hover后离开时
13     CameraBeHovered: function () {
14         if (window.HideCameraTooltip) {
15             window.HideCameraTooltip();
16         }
17     },
18 //摄像头被点击时
19     CameraBeClicked: function (cameraname, cameraip) {
20         var cameraname = UTF8ToString(cameraname);
21         var cameraip = UTF8ToString(cameraip);
22 
23         if (window.HandleCameraClick) {
24             window.HandleCameraClick(cameraname, cameraip);
25         }
26     }
27 });

CameraColliderAndHover.cs内部定义:

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using System.Runtime.InteropServices;
 4 using UnityEngine;
 5 using UnityEngine.EventSystems;
 6 
 7 /// <summary>
 8 /// 用于处理第二页楼层内摄像头模型的点击事件和hover事件的处理(也会涉及unity通知jslib进而调用webjs逻辑)
 9 /// </summary>
10 public class CameraColliderAndHover : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler,IPointerClickHandler
11 {
12     [Header("摄像头名称/位置")]
13     public string cameraName;
14 
15     [Header("摄像头IP")]
16     public string cameraIP;
17 
18 
19     ////--------------- 引入中间件jslib定义的中间方法 (会自动搜索中间件方法)----------------------
20     //注意:
21     //.jslib 定义的函数只会在 WebGL 构建产物里被 Unity 的 WebGL 桥接系统生成/绑定成可调用的符号;在 **Editor 里运行(UNITY_EDITOR)**时,这个符号根本不存在
22     //所以在函数调用处,加 #if UNITY_WEBGL && !UNITY_EDITOR #else #endif等判断,避免unity editor调试时报错!!
23 
24     //摄像头被hover时
25     [DllImport("__Internal")]
26     private static extern void CameraBeHovering(string cameraname,string cameraip,float x,float y );
27 
28     //摄像头被hover后离开时
29     [DllImport("__Internal")]
30     private static extern void CameraBeHovered();
31 
32     //摄像头被点击时
33     [DllImport("__Internal")]
34     private static extern void CameraBeClicked(string cameraname, string cameraip);
35 
36 
37     ////--------------- hover、click业务逻辑方法 ----------------------
38 
39 
40     /// <summary>
41     /// 1. 实现IPointerEnterHandler接口方法
42     /// 
43     /// 摄像头被hover时
44     /// </summary>
45     /// <param name="eventData"></param>
46     public void OnPointerEnter(PointerEventData eventData)
47     {
48         //获取鼠标hover时的转换到屏幕平面的(X,Y)位置
49         float webX = Input.mousePosition.x;
50         //注意:Unity的Y轴是从下往上;而Web的Y轴是从上往下
51         float webY = Screen.height - Input.mousePosition.y;
52 #if UNITY_WEBGL && !UNITY_EDITOR
53         CameraBeHovering(cameraName, cameraIP, webX, webY);//调用中间件方法
54 #else
55         Debug.Log($"摄像头被hoverl了,webX,WebY:{webX},{webY}");
56 #endif
57     }
58 
59 
60     /// <summary>
61     /// 2. 实现IPointerExitHandler接口方法
62     /// </summary>
63     /// <param name="eventData"></param>
64 
65     public void OnPointerExit(PointerEventData eventData)
66     {
67 #if UNITY_WEBGL && !UNITY_EDITOR
68         CameraBeHovered();//调用中间件方法
69 #else
70         Debug.Log($"摄像头hover离开,触发隐藏!");
71 #endif
72     }
73 
74 
75     /// <summary>
76     /// 3. 实现IPointerClickHandler接口方法
77     /// </summary>
78     /// <param name="eventData"></param>
79     public void OnPointerClick(PointerEventData eventData)
80     {
81 #if UNITY_WEBGL && !UNITY_EDITOR
82         CameraBeClicked(cameraName, cameraIP);
83 #else
84         Debug.Log($"摄像头被点击,触发通知web端显示弹出框并显示视频流!");
85 #endif 
86     }
87 
88 }

二、Web端开发

 

http://www.jsqmd.com/news/709405/

相关文章:

  • 官方认证|2026年云南十大正规地接旅行社 / 云南纯玩旅行社 / 云南定制游旅行社地接社旅游公司排名,昆明等地拉勾旅行口碑断层领先 - 十大品牌榜
  • CoCo框架:代码驱动的文本到图像生成技术解析
  • GIF动图批量转换静图工具:功能配置与使用指南
  • Docker AI Toolkit 2026兼容性矩阵全曝光(覆盖CUDA 12.4–12.8 / ROCm 6.2 / Apple M4 Ultra),你的硬件在支持列表第几位?
  • 2026最权威的十大降AI率工具推荐
  • 四川交通防护设施盘点:防护栏防护网网围栏实力品牌推荐 - 深度智识库
  • DREAM框架:多模态学习中的对比与生成统一模型
  • React TypeScript Cheatsheet:Prettier代码格式化终极集成指南
  • 官方认证|2026年云南十大正规定制游 / 云南纯玩旅行社 旅游公司排名,昆明等地,拉勾旅行口碑断层领先 - 十大品牌榜
  • 别再只用uni.showLoading了!手把手教你为微信小程序定制全局Loading(附Vuex+Vite配置)
  • cordova-sqlite-storage高级特性探索:FTS、R-Tree和事务管理
  • DeepCode框架:AI代码生成技术的信息流管理突破
  • 如何快速实现HTTPie CLI国际化支持:多语言环境下的完整使用指南
  • 2026年乌鲁木齐全屋定制工厂选购指南:本地源头工厂如何彻底解决异地定制的三大痛点 - 精选优质企业推荐官
  • sd-webui-controlnet终极指南:掌握AI绘画精准控制的完整教程
  • LLM在编程领域的革命性应用与实践
  • 告别手动录入!用Python库img2table一键提取PDF/图片中的表格(附Tesseract配置)
  • 5分钟掌握华硕笔记本终极轻量化控制方案:G-Helper完全指南
  • 山东最推荐的国际高中国际中学中学国际部高中国际部初中国际部学校课程有哪些?2026年青岛等地市场选择前五排名 - 十大品牌榜
  • 构建消息聚合器:从插件化架构到实战部署
  • OpenSoul认知AI框架:三层记忆图谱与虚拟神经化学构建类脑智能体
  • G-Helper终极指南:华硕笔记本性能调优与显示修复的完整解决方案
  • GDSDecomp:如何用逆向工程工具在5分钟内完成Godot项目恢复?
  • AI工程实战:基于开源技能库构建智能编码助手与自动化工作流
  • 如何快速掌握jq:轻量级JSON处理器的核心功能与实用指南
  • 【应用】openclaw之图片、pdf等OCR识别转文字web服务
  • Wox启动器终极指南:跨平台效率工具的全面配置与实战技巧
  • 深度解析:跨平台QQ数据库解密技术原理与实践指南
  • 长沙福麟家居设计:岳麓比较好的弹簧脱落修复 - LYL仔仔
  • 如何解决Blender渲染难题?5个Radeon ProRender实用技巧