
前阵子我接到一个线下展厅的互动大屏需求用户站在屏幕前隔空比划几下就能完成按钮点击、页面翻页同时后台还要记录每个人在哪些区域停留、点了哪个按钮、交互时长是多少。甲方一开始想上Kinect或者TOF深度相机一算硬件成本加开发周期直接劝退了。最后我用了一台普通USB摄像头配合Unity的UGUI事件系统再加一层轻量的手部识别方案把整套东西做了下来。这里就把这套“Unity普通摄像头实现UI事件分析”的完整思路、核心代码思路和踩坑记录整理一下给后面做类似项目的朋友一个参考。这套方案能做什么简单说就是三件事第一用普通摄像头识别用户手部动作映射成屏幕坐标替代鼠标触控去操作UGUI界面第二把手势状态解析成语义明确的UI事件比如悬停、点击、拖拽第三记录每一次交互行为生成可分析的数据用来做热力图、转化漏斗或者用户行为回溯。适合的场景包括数字展厅、智能货架、互动广告屏、线下自助终端以及任何不想让用户接触屏幕、又希望统计交互效果的场合。关于技术选型我先说结论如果你项目预算有限、设备就是普通摄像头那MediaPipe手部关键点识别是当前性价比最高的路线比OpenCV肤色检测稳定得多也比深度相机便宜得多。下面我把整个项目的推进过程拆开讲。1. 项目定位为什么普通摄像头能扛起UI交互分析这杆旗1.1 方案对比深度相机太贵普通摄像头刚刚好很多人一听隔空交互第一反应就是要上Kinect、Azure Kinect、Intel RealSense或者奥比中光这类深度相机。确实深度相机能直接拿到手部在三维空间的坐标精度高、抗背景干扰强但问题也很现实一个深度模组少则几百多则几千而且大屏互动往往需要多台设备覆盖多个屏幕成本一下子就上去了。普通USB摄像头就不一样了。一个720P、30帧的摄像头才几十块钱而且现在的电脑、一体机、互动大屏基本都自带摄像头连采购都省了。可能有人会问没有深度只有2D画面够用吗实际上对于隔空操作UI这个场景2D坐标完全够用。你想一下用户站在大屏前手的平面位置决定了光标在哪至于手离屏幕多远根本不重要只要判定“什么时候算点击”就行。这个“点击时刻”用2D手势变化就能判断比如握拳、停留超过阈值、或者做一个明确的点击动作。所以普通摄像头方案的核心逻辑是用2D坐标定位用时间或手势语义判定点击。这个思路在交互体验上不如深度相机那么顺滑但完全够用而且能省下90%的硬件成本。1.2 两条主流技术路线MediaPipe 与 OpenCV 肤色检测接手项目时我首先梳理了两条技术路线第一条是OpenCV肤色检测。思路是在摄像头画面里做HSV色彩空间转换把肤色像素提取出来做一个轮廓查找然后算轮廓质心作为手部位置。这个方案的优点是可控性强纯CPU计算不依赖外部库Unity里有OpenCV for Unity插件可以直接用。缺点也很明显对光照极其敏感肤色阈值一调就是半天遇到深色衣服或复杂背景时误检率很高更别说多个人同时入镜。热点词里那些“opencv调用电脑摄像头颜色轮廓”的搜索记录说明有不少人走过这条老路但我的建议是除非你的场景光源完全可控、背景完全纯色否则别把肤色检测当主力方案。第二条是MediaPipe手部关键点识别方案。MediaPipe是Google开源的一套机器学习方案其中的Hand Landmarker模型能输出手部21个关键点的坐标包括指尖、指节、腕部还能输出掌心朝向和手势置信度。Unity集成方案也比较成熟通过UPM包引入com.github.homuler.mediapipe可以跑在Windows、Android、iOS和WebGL上。这套方案的优点是识别稳定、抗干扰强、精度高一个普通摄像头就能实现很流畅的手势交互。缺点是需要打包模型文件、对硬件有一定要求不过现在随便一台电脑跑起来都没压力。我最终选了MediaPipe路线。原因很简单稳定性优先。互动大屏是给真实用户用的不是给实验室环境用的背景有行人、灯光有明暗肤色检测那套根本扛不住。MediaPipe模型经过大量数据训练对复杂环境的适应性远好于手工特征。1.3 系统整体架构整套系统的数据流可以这样理解摄像头采集RGB帧 → 输入MediaPipe手部检测管线 → 得到手部关键点坐标与手势置信度 → 坐标映射到屏幕空间 → Unity UGUI事件系统模拟虚拟指针 → 触发按钮悬停、点击事件 → 交互数据写入记录模块 → 输出行为分析结果按模块拆的话工程里大致有这几个部分视频采集模块封装WebCamTexture处理镜像、分辨率、帧率手部识别模块封装MediaPipe Hand Landmarker的初始化、逐帧推理、结果解析坐标映射模块把图像坐标转换成屏幕坐标做平滑滤波事件桥接模块模拟PointerEventData把虚拟指针路由进UGUI事件管道行为记录模块监听事件按时间戳记录字段输出CSV/JSON可视化模块热力图、统计面板如果需要实时查看数据。这样的分层好处是每个环节可以单独替换。比如你以后想换TOF相机只需要改坐标映射模块事件桥接和分析模块完全不用动。2. 摄像头采集与手势识别从画面到指尖坐标的核心细节2.1 WebCamTexture 的坑与调优Unity读取普通摄像头最直接的方式就是WebCamTexture上手很简单WebCamDevice[] devices WebCamTexture.devices; WebCamTexture camTexture new WebCamTexture(devices[0].name, 640, 480, 30); camTexture.Play();这里第一个坑就是分辨率选择。很多新手会直接把分辨率开到1920x1080结果发现MediaPipe识别根本跑不满帧率。我做性能测试时发现手部关键点检测在640x360分辨率下和1080p下的定位精度差距很小但帧率能差到三倍以上。原因很好理解手部占据图像中很小的区域但缩小的画面反而让模型更容易泛化同时减少了纹理上传和推理耗时。所以我的建议是摄像头分辨率控制在640x480或640x36030帧即可给MediaPipe预留推理时间。第二个坑是镜像问题。大屏场景通常显示的是镜像画面就像照镜子这样用户抬手时动作方向和屏幕方向一致体验才自然。但MediaPipe检测结果是在原始图像坐标系下的如果画面做了镜像显示坐标就必须跟着翻转。实际操作中我直接翻转RawImage的localScale.x为-1来显示镜像画面然后在坐标映射时做一次x方向翻转normalizedX 1.0f - rawNormalizedX。这个细节不处理好手停在左边光标却跑到右边用户直接懵。第三个坑是相机启动延迟。WebCamTexture.Play()之后并不是立刻有画面需要等几帧。我遇到这种情况会在启动后做一次等待逻辑或者先用一个黑屏图像占位等camTexture.didUpdateThisFrame为true再接MediaPipe流程避免空帧导致推理崩掉。2.2 集成 MediaPipe 手部识别配置与调用MediaPipe在Unity里的接入流程比较固定。首先通过UPM导入包在Package Manager里添加Git URL。之后需要下载手部模型文件hand_landmarker.task放到StreamingAssets目录下。初始化模型时可以设置几个关键参数var task HandLandmarker.CreateFromOptions(new HandLandmarkerOptions( BaseOptions new BaseOptions(modelAssetPath: hand_landmarker.task), RunningMode RunningMode.VIDEO, NumHands 1, MinHandDetectionConfidence 0.5f, MinHandPresenceConfidence 0.5f, MinTrackingConfidence 0.5f ));关于NumHands这里有个取舍。我测试过同时检测两只手但大屏交互场景下两个人同时操作会产生光标冲突体验反而不如只追踪一只手。所以我直接设置NumHands1取置信度最高的那只手作为交互手。每帧推理时需要把Unity的Texture2D转换成MediaPipe的Image对象。这个转换是性能关键点。最直接的方式是Texture2D.GetPixels32()再转成ByteBuffer但开销非常大。优化做法是直接用Graphics.CopyTexture把GPU纹理复制成支持读回的格式或者使用AsyncGPUReadback异步读取。我这里给一个通用但会慢的写法作为参考等熟悉后再优化Texture2D tex new Texture2D(width, height, TextureFormat.RGBA32, false); RenderTexture.active renderTexture; tex.ReadPixels(new Rect(0, 0, width, height), 0, 0); tex.Apply();推理完成后结果里包含21个关键点。每个关键点有归一化的x、y坐标相对图像宽高和一个z值表示深度参考不是真实距离。同时还有handedness信息告诉你是左手还是右手——前置摄像头拍的画面相当于镜像所以左手的识别结果可能是Right这个信息我一般不用来判断左右只看点位。2.3 理解21个关键点与手势状态MediaPipe手部模型的21个关键点分布很直观0号点是腕部1到4号是拇指从根部到指尖5到8号是食指9到12号是中指13到16号是无名指17到20号是小指。要判断一个手势最常用的点就是指尖4、8、12、16、20和腕部0。比如判断“握拳”可以这样想握拳时指尖会靠近掌心所以指尖到腕部的距离会显著缩短。我可以计算每个指尖到腕部的归一化距离当所有指尖都低于某个阈值时判定为握拳当食指尖距离明显大于其他手指时判定为“食指指向”或“抬手悬停”。我实际用的手势判断逻辑是悬停/移动只要检测到手默认就是悬停状态此时控制光标在UI上移动点击准备手势变为握拳且保持稳定点击触发握拳状态下拳头在某个位置停留超过阈值时间或握拳状态持续时间跨越两个状态帧并及时松开无效手势连续帧置信度低于阈值直接忽略。这个状态机看起来简单但实际工程里一定要处理抖振问题。建议一套手势判断要有连续N帧相同结果才能进入对应状态比如连续3帧都判定为握拳才真正进入握拳状态避免单帧误检触发点击。2.4 坐标映射与平滑识别出来的关键点坐标是归一化图像坐标0到1之间浮点数如果画面是镜像的先做x翻转。接下来要把它映射到Unity屏幕坐标。我的映射方式Vector3 screenPos new Vector3( normalizedX * Screen.width, (1.0f - normalizedY) * Screen.height, 0f );注意y轴方向图像坐标原点在左上角屏幕坐标原点在左下角所以y要翻转。但这里有个大坑RawImage在Canvas上的显示比例和Screen的比例不一定一致。如果RawImage拉伸填满整个画面视频画面比例和屏幕比例不同画面会被拉伸坐标映射也要跟着拉伸。处理这个问题要么让RawImage保持宽高比加ContentSizeFitter要么在映射时按照RawImage的实际显示尺寸做转换。我推荐后者因为大屏场景往往希望画面全屏展示。坐标平滑是另一个关键点。摄像头逐帧检测的原始坐标会有不少抖动直接驱动光标的话用户会看到光标在目标按钮上疯狂抖动根本没法进行悬停点击。我用的是一阶指数平滑smoothedPos Vector3.Lerp(smoothedPos, rawTargetPos, 0.3f);这个alpha取值需要现场调通常在0.2到0.4之间。alpha太小光标反应迟钝用户手指移过去了光标还在后面追alpha太大抖动过滤不掉。另外当检测到手部丢失后又重新出现时要把smoothedPos直接赋值成当前坐标避免光标从上一帧位置“飞”过来。3. 把手势变成UGUI事件从坐标到点击的魔法桥接3.1 为什么要模拟 PointerEventDataUnity的UGUI事件交互核心是EventSystem它会维护一个“当前指针”概念鼠标是最常见的指针。正常情况下EventSystem把鼠标位置射向UI元素触发OnPointerEnter、OnPointerClick等回调。现在我们要做的是把自己的手部坐标伪装成一个鼠标指针喂给UGUI事件系统。为什么不直接改Input.mousePosition有两个原因一是鼠标指针还在屏幕某个位置两个指针同时存在会造成混乱二是UGUI的事件路由涉及hover状态管理直接写坐标绕过了EventSystem的状态机很容易出现按钮悬停态不更新、点击事件触发两次之类的问题。正确做法是实现一个自定义的“虚拟指针”并给它喂一个构造好的PointerEventData。这样可以复用UGUI的事件路由、GraphicRaycaster的射线检测逻辑以及所有UI组件的事件接口。简单说就是把EventSystem的那套“鼠标”替换成“手势光标”事件链路完全不变。3.2 实现虚拟指针与事件路由核心代码思路是这样的PointerEventData pointerData new PointerEventData(EventSystem.current); pointerData.position currentScreenPos; ListRaycastResult results new ListRaycastResult(); graphicRaycaster.Raycast(pointerData, results);拿到results后第一项就是当前命中的最上层UI元素。接下来要在这个元素上依次比较“上一帧悬停的元素”和“当前帧悬停的元素”如果不同就触发OnPointerExit和OnPointerEnter。点击逻辑则需要维护一个点击状态机。我的实现是当手势为握拳且位移小于20像素时开始累计停留时间当停留时间超过0.6秒触发一次OnPointerDown和OnPointerClick。之后即使手没动也只在松开手势时触发OnPointerUp避免连续触发。这里额外要说一个点UGUI的GraphicRaycaster默认只检测带Graphic组件的UI元素如果你用了CanvasGroup、按钮嵌套、ScrollView等结构记得在Canvas上添加合理的Ignore Reversed Graphics设置避免后面绘制的网格挡住前面按钮。3.3 点击判定策略悬停计时还是手势变化关于“什么时候算点击”业界大体有两种方案。第一种是“悬停计时点击”手在某位置停留超过设定时间即触发点击。优点是用户容易学习不需要额外手势动作缺点是容易误触用户只是停下来看内容就被误判成点击。第二种是“手势变化点击”比如从张开手变成握拳算点击或者食指向下弯曲一次算点击。优点是更符合“隔空点击”的直觉误触率低缺点是手势识别会增加延迟而且用户容易做得不标准导致识别失败。我自己的项目里用的是混合方案悬停0.6秒手部移动距离低于30像素判定为一次点击。这个方案不需要用户学习手势稳定性高。在展厅实际测试时用户第一次使用平均2-3秒就能理解“我停住就是点击”学习成本很低。如果你希望更准可以在停留的基础上加入“张开→握拳”的切换作为确认信号视觉反馈上做一个倒计时圆环用户看着圆环走完就知道点击生效了。3.4 命中区域优化如何扩大按钮点击范围做大屏互动UI最容易忽略的是命中区域设计。屏幕上按钮看起来那么大但在大屏场景下用户手臂悬空对位置的掌控精度远不如鼠标或手指触摸。我一开始用默认Button组件结果用户经常点不中尤其是小按钮。这里就用上了热搜里那个问题——“unity如何扩大按钮的点击范围”。其实思路很简单把可视的图形和可点击的命中区分离。我给每个按钮增加了一个不可见的Image组件设成透明Alpha0但RaycastTargettrue并把这个透明区域的RectTransform扩展成原来的1.5到2倍大小。这样视觉上按钮是40x40实际点击区是80x80点击成功率大幅提高。另外一个进阶做法是重写RectTransform的扩展方法动态计算命中区域但我觉得对多数项目没必要。把透明底图放大2倍已经能覆盖绝大多数误点场景了。3.5 交互反馈设计隔空交互和物理点击的最大区别是没有“手指碰到屏幕”的反馈所以视觉和听觉反馈必须做得比正常UI更重。我建议每个可交互元素至少有三种状态未命中普通状态悬停缩放1.1倍或高亮描边让用户知道“我的手已经对准这个按钮了”点击生效变色音效可能有震动。这里要注意反馈延迟。临界点就是0.3秒——反馈的视觉变化必须在手势判断为点击的瞬间出现而不是等0.6秒的停留计时结束后才变化。所以我的做法是在手势进入“疑似点击”握拳且位移小于阈值状态时立刻播放一个1.2秒的进度环动画进度环走完时点击事件真正触发。这样用户既有即时反馈又不会因为等待而产生短暂迷茫。4. UI事件分析不止是触发交互还要记录行为4.1 数据模型一次交互记录哪些字段“UI事件分析”真正的价值在于把交互过程变成可量化数据。我给每条交互记录定义了这些字段字段名类型说明sessionIdstring一次会话的唯一标识通常按摄像头画面出现手到消失为一次会话timestampDateTime事件发生时间精确到毫秒eventTypeenumhover_enter、hover_exit、click、drag_start、drag_enduiElementIdstring命中的UI元素名称Button的name或路径normalizedXfloat事件位置的归一化x坐标normalizedYfloat事件位置的归一化y坐标handConfidencefloat手部检测置信度方便事后剔除低质量数据durationfloat悬停或点击的持续时长毫秒建这个模型时有个容易被忽略的细节uiElementId不能只记录按钮名字因为不同页面可能有相同名字的按钮。我采用Canvas路径拼上按钮名比如MainPage/StartButton这样后期能准确知道用户点的是哪个页面哪个按钮。另外任何一次悬停event都要记录进入和离开两条记录才能算停留时长。光有click记录是没法分析“用户在哪里犹豫了很久”的。4.2 存储与导出数据量不大时直接写成CSV文件就够了。我在Update里收集事件队列每1秒批量写入一次到Application.persistentDataPath下。这样避免高频WriteAllText导致主线程卡顿。如果项目需要做更复杂的查询比如按时间段、按用户、按UI元素筛选可以用SQLite。Unity里比较成熟的方案是sqlite-net操作简单支持线程适合现场数据分析面板实时查询。这里要特别提醒一个部署上的坑如果你把项目发布成WebGLApplication.persistentDataPath对应的是浏览器里的IndexedDB文件系统写入失败是常见问题。热搜里那个“unity 发布 webgl 使用 idbfs 写入失败”就是这个问题。原因通常是浏览器隐私模式禁用IndexedDB、存储配额已满或者用户还没触发任何交互就尝试写入。我的建议是WebGL版本不要依赖本地文件写入直接把交互记录通过网络请求发到后端API或者至少在页面关闭前做一次批量上报。4.3 热力图的实现思路热力图是UI事件分析中最直观的展示方式。我实现时很简单把整个屏幕划分为32x18的网格或者按实际屏幕比例设每个网格存一个计数数组。每条click或hover_enter记录到达时根据归一化坐标找到网格索引计数加一。结束时要显示热力图就按不同计数值映射成颜色用Texture2D绘制出来叠在交互页面上做半透明展示。这里有个细节热力图的颜色映射要符合认知。我用的色带从蓝到绿到红数值越高颜色越暖。为了让数据对比明显最好做归一化用最大值把计数缩放到0到1。热力图不仅能看到“哪里点击多”还能看到“哪里用户一直悬停但没点击”——后者往往意味着用户尝试寻找一个入口却找不到是产品设计问题的信号。4.4 交互漏斗与场景价值有了数据之后可以做最有价值的漏斗分析摄像头检测到人 → 人手出现 → 首次悬停 → 首次点击 → 完成核心任务每一层的转化率都能反映交互设计的健康度。比如“人手出现”到“首次悬停”转化率低说明用户没理解“抬手就能操作”这件事需要加引导动画“首次悬停”到“首次点击”转化率低说明点击判定手感有问题可能阈值太严或者按钮命中区太小。这套分析在数字展厅场景里特别有价值。展方需要知道哪块内容受欢迎、观众在哪个展项前停留最久、哪个按钮反复被点。放在传统方案里需要用感知设备加专门的分析系统现在一个USB摄像头加一套UI事件记录就能闭环。5. 常见问题与排查技巧实录5.1 高频问题速查表现象常见原因解决方案画面是反的光标方向相反摄像头镜像未处理RawImage的localScale.x设为-1同时坐标映射做x翻转光标剧烈抖动按钮悬停态乱跳未做坐标平滑或alpha过大用Lerp做指数平滑alpha取0.2-0.4检测丢失后重置位置手不动时偶尔触发点击点击判定阈值太小延长停留时间到0.6秒增加移动距离阈值到30像素点击事件触发两次每帧都构造PointerEventDataDown和Up逻辑混乱点击事件用状态机管理同一手势周期内只触发一次ClickMediaPipe检测度很低手部框跟不上分辨率太高导致帧率低或置信度阈值过严降到640x480MinHandDetectionConfidence调到0.4背景有其他人光标乱跑NumHands大于1或置信度低设为NumHands1忽略低置信度的检测结果WebGL部署后数据存不下来IDBFS写入失败改用网络请求上报或等用户交互后再写文件打开程序黑屏摄像头无画面摄像头权限未授权或设备被占用检查系统权限关闭其他占用摄像头的软件5.2 性能优化三板斧性能是整个方案的生死线。我做的第一版在1080p分辨率下MediaPipe推理一帧要80毫秒UI帧率掉到个位数体验完全不可用。后来做了三个优化才救回来。第一刀砍分辨率。摄像头从1080p降到640x360推理耗时砍掉一半多而手部关键点精度几乎没变。第二刀做跳帧。MediaPipe哪怕在360p下推理也要20毫秒左右没必要每帧都跑。我改成每2帧跑一次推理中间帧用上一次的结果做插值配合平滑滤波视觉上依然顺滑。第三刀优化纹理读取。不在主线程用ReadPixels改成在协程里用AsyncGPUReadback或者只在需要推理的那一帧读取一次避免每帧都做Texture2D转换。优化后整个系统在普通办公电脑上能稳定跑到30到40帧MediaPipe推理消耗控制在每秒15次以内UI渲染完全不受影响。5.3 网络摄像头与RTSP流场景扩展有些项目场景没有USB摄像头而是用已有的网络摄像头比如海康、宇视、大华的枪机或半球摄像头。Unity的WebCamTexture不支持直接拉RTSP流这是个硬伤。我查到的可行解决方案有这几个第一种用VLC for Unity插件。这个基于libVLCUnity的VideoPlayer不支持RTSP但VLC的Unity版本支持拉流后可以输出到Texture。缺点是这个插件要许可证费而且WebGL不支持。第二种自建一个RTSP转虚拟摄像头的中间层。在本地跑一个FFmpeg或者OBS把RTSP流转成虚拟摄像头源然后Unity的WebCamTexture列表里就能看到它。这个方法免费、通用、稳定缺点是部署多了一层。第三种直接在Unity里集成FFmpeg库来解码RTSP。技术可行但工程量不小如果没有专门团队我不建议自己写解码。如果你只是做原型验证建议直接上OBS虚拟摄像头方案20分钟就能通。生产环境再考虑VLC插件或者定制化方案。5.4 部署到WebGL与移动端的注意点WebGL部署有三个坑一定要提前规避。第一个是摄像头权限。浏览器必须跑在HTTPS或者localhost环境下才能调用getUserMedia否则摄像头直接打不开。第二是模型文件加载。StreamingAssets在WebGL下要用UnityWebRequest加载不能直接用File读取MediaPipe的Unity插件通常会封装好这一点但你要确认模型路径配置正确。第三个就是前面说的IDBFS写入失败交互记录一定要走网络上报不能依赖本地文件。移动端部署则主要是权限问题。Android打包需要在Manifest里加上CAMERA权限并且在运行时申请动态权限。iOS也一样需要在Info.plist里加NSCameraUsageDescription。如果你是在Pico这类XR设备上跑要注意摄像头可能被系统占用建议先用系统自带的Passthrough权限测试再接管相机源。5.5 我踩过的几个细节坑最后分享几个文档里不太会写的细节。第一个是UI刷新时机。EventSystem的Update和我的手势驱动更新都在Update阶段如果顺序不对会经常发生“上一帧的悬停状态还没更新这一帧的手势已经变了”的错位。我最后的解决办法是手势驱动的坐标更新放在Update末尾事件路由放在LateUpdate保证同一帧的数据完整统一。第二个是置信度的阈值需要分场景调。展厅现场灯光暗、逆光、玻璃反光都会影响检测。我预置了三档配置明亮环境、普通环境、暗光环境现场部署时一键切换比每次都改代码方便太多。第三个是手柄光标的位置偏移。MediaPipe返回的腕部坐标和食指尖坐标往往差出几个屏幕像素你到底用哪个指头当光标我试过用腕部、用食指、用拇指最终发现食指指腹最符合“手指点在按钮上”的直觉。如果你发现光标位置总是和用户预期偏差试试切换一下关键点索引。结尾这套“Unity普通摄像头实现UI事件分析”的方案我前前后后做了三四个版本从最早OpenCV肤色检测的痛苦挣扎到MediaPipe带来的体验跃升再到最后的UGUI事件桥接和环境适配每一步都踩过不少坑。现在回看最值钱的其实是“把摄像头手势变成标准UI事件”这一步——一旦数据进入了UGUI事件系统后面所有分析、可视化、优化都是水到渠成的事情。如果你正打算做类似的项目我个人的建议是先用最简单的代码把整条链路跑通哪怕识别不准、事件乱触发都没关系先看到“摄像头→手势→UI事件→数据记录”的完整闭环再逐段优化。这个项目后续可以扩展的方向也很多比如接入数字孪生场景做隔空操控大屏模型或者把同一套手势方案带到XR设备里做混合现实交互入口。我目前正在做的版本加了双人手势支持虽然很多细节还没跑顺但已经能看到它在大屏互动这块的应用潜力了。