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


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


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

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

(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端开发
