You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:41:12