ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/8/11 23:03:29 拓冰建站 浏览量
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端开发