HoloLens 2+Unity(MRTK2)中WebView2网页交互功能失效问题排查
解决方案
针对你遇到的WebView2无法交互的问题,核心原因是当前代码仅实现了MouseDown事件,缺少完整的鼠标事件生命周期,同时坐标转换逻辑未匹配WebView的实际渲染分辨率,以下是修复步骤:
1. 补全完整鼠标事件链
网页交互需要完整的按下-释放-点击事件周期,仅发送MouseDown无法触发按钮点击。需要添加OnPointerUp事件,同步发送MouseUp和MouseClick事件。
2. 修正坐标转换逻辑
当前的坐标转换仅映射到UI Rect的本地坐标,未考虑WebView内部的像素分辨率。需要将HoloLens的指针位置转换为WebView的像素坐标,同时注意WebView与Unity UI的Y轴原点差异(WebView原点在左上角,Unity UI原点在左下角)。
3. 添加滚动事件支持
若需要滚动网页,需处理MRTK的滚动输入事件,发送MouseWheel事件给WebView。
完整修复代码
private IWebView _webView; private IWithMouseEvents _mouseEventsWebView; private RectTransform _webViewRect; private void Start() { var webViewComponent = GetComponentInChildren<WebView>(); _webViewRect = webViewComponent.GetComponent<RectTransform>(); webViewComponent.GetWebViewWhenReady(webView => { _webView = webView; _mouseEventsWebView = _webView as IWithMouseEvents; if (_mouseEventsWebView == null) { Debug.LogError("当前WebView不支持鼠标事件接口"); } }); } public void OnPointerDown(MixedRealityPointerEventData eventData) { if (_mouseEventsWebView == null) return; var webViewCoords = ConvertToWebViewPixelCoords(eventData.Pointer.Position); SendMouseEvent(WebViewMouseEventData.EventType.MouseDown, webViewCoords); } public void OnPointerUp(MixedRealityPointerEventData eventData) { if (_mouseEventsWebView == null) return; var webViewCoords = ConvertToWebViewPixelCoords(eventData.Pointer.Position); SendMouseEvent(WebViewMouseEventData.EventType.MouseUp, webViewCoords); SendMouseEvent(WebViewMouseEventData.EventType.MouseClick, webViewCoords); } public void OnScroll(PointerEventData eventData) { if (_mouseEventsWebView == null) return; float scrollDelta = eventData.scrollDelta.y; var webViewCoords = ConvertToWebViewPixelCoords(eventData.Pointer.Position); var mouseWheelEvent = new WebViewMouseEventData { X = webViewCoords.x, Y = webViewCoords.y, Type = WebViewMouseEventData.EventType.MouseWheel, WheelDelta = (int)(scrollDelta * 120), TertiaryAxisDeviceType = WebViewMouseEventData.TertiaryAxisDevice.PointingDevice }; _mouseEventsWebView.MouseEvent(mouseWheelEvent); } private Vector2Int ConvertToWebViewPixelCoords(Vector3 worldPos) { Camera.main.WorldToScreenPoint(worldPos, out Vector2 screenPos); RectTransformUtility.ScreenPointToLocalPointInRectangle(_webViewRect, screenPos, Camera.main, out Vector2 localPos); var webViewSettings = _webView.Settings; float pixelX = (localPos.x + _webViewRect.rect.width / 2) * (webViewSettings.Width / _webViewRect.rect.width); float pixelY = (_webViewRect.rect.height / 2 - localPos.y) * (webViewSettings.Height / _webViewRect.rect.height); return Vector2Int.RoundToInt(new Vector2(pixelX, pixelY)); } private void SendMouseEvent(WebViewMouseEventData.EventType eventType, Vector2Int coords) { var mouseEvent = new WebViewMouseEventData { X = coords.x, Y = coords.y, Type = eventType, Button = WebViewMouseEventData.MouseButton.ButtonLeft, TertiaryAxisDeviceType = WebViewMouseEventData.TertiaryAxisDevice.PointingDevice }; _mouseEventsWebView.MouseEvent(mouseEvent); }
额外注意事项
- 确保脚本所在的GameObject已添加
MRTK Input Handler组件,并勾选对应的事件(Pointer Down、Pointer Up、Scroll),保证事件能被正确触发。 - 检查WebView的
Settings中是否启用了输入交互支持,部分预览版需手动开启相关配置。 - 测试时可在
ConvertToWebViewPixelCoords中打印坐标值,确认转换后的坐标处于WebView的像素范围内(0到Width/Height之间)。
内容的提问来源于stack exchange,提问作者user22245444
相关产品推荐
相关产品推荐

