Unity3d windows平台基于3D WebView for Windows and macOS (Web Browser)插件打开内嵌网页支持AR/VR功能实现

本文介绍了如何在Unity3d中使用3DWebViewforWindowsandmacOS插件来渲染和交互Web内容。该插件支持多个平台,包括VR/AR,能调用键盘和鼠标事件,执行JavaScript,以及与网页进行双向通信。通过示例展示了加载网页、执行页面JS、消息通信及模拟点击等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

之前Unity3d的程序在win pc上打开网页一般使用EmbeddedBrowser插件,也算是比较好用的,不过经过查找我发现3D WebView for Windows and macOS (Web Browser)插件也很不错。支持?Vuplex VR/AR 浏览器的相同代码,轻松地在 Windows 和 macOS 上以 3D 形式渲染 Web 内容并与之进行交互。支持Android、iOS、Windows、macOS?和?UWP/Hololens这些平台,不过这里的版本仅支持Windows and macOS平台。其余的平台需要下载其他版本。支持调用键盘和鼠标事件,以编程方式调整大小、缩放、滚动和后退/前进;支持在当前页面的上下文中执行 JavaScript; 支持将消息从JavaScript(网页) 发送到 C# 或者反向发送;支持监听浏览器事件,例如TitleChanged、UrlChanged以及PageLoadFailed;支持查看 PDF;支持在世界坐标系内和UI画布上打开网页。功能很齐全,但是价格也很不美丽。

效果

这是打开网页:

 VR中应用:

在这里插入图片描述

打开网页

这里就使用CanvasWebViewPrefab?快速上手,打开网页它们会自动渲染为 Texture2D 并处理用户互动(单击、滚动、悬停、拖动)。

准备场景

新建一个场景,并新建一个Canvas。
导入插件后,找到Assets\Vuplex\WebView\Core\Prefabs\Resources\CanvasWebViewPrefab.prefab预设:

在这里插入图片描述

 将其拖到Canvas下。

编写代码

这里我们在运行就打开Unity官网:

using UnityEngine;
using Vuplex.WebView;

public class test : MonoBehaviour
{
    public CanvasWebViewPrefab canvasWebView;

    async void Start()
    {
        await canvasWebView.WaitUntilInitialized();

        canvasWebView.WebView.LoadUrl("https://unity.cn/");
    }
}

 将脚本组件挂到场景,并将canvasWebView关联起来。

运行起来效果:

在这里插入图片描述

Unity执行页面JS

这个主要调用ExecuteJavaScript来实现,该函数有两个重载:

void?ExecuteJavaScript(string?javaScript,?Action<string>?callback)
Task<string>?ExecuteJavaScript(string?javaScript)

 为了运行 JavaScript,必须首先加载网页。您可以使用WaitForNextPageLoadToFinish()或LoadProgressChanged事件在页面加载后运行 JavaScript。

如:

await webViewPrefab.WaitUntilInitialized();
 await webViewPrefab.WebView.WaitForNextPageLoadToFinish(); 
var headerText = await webViewPrefab.WebView.ExecuteJavaScript("document.getElementsByTagName('h1')[0].innerText"); 
Debug.Log("H1 text: " + headerText);

 这就是找到标签名 h1并输出它的文本。

Unity与网页消息通信

使用该插件是可以实现 Unity与网页的双向通信,只不过要对接完美,需要两边的开发者协商好通信消息以及格式。

Unity向网页发消息

从 Unity向 网页 发送消息是使用PostMessage()函数来实现。
发送消息的 C# 脚本:

async void Start() {
    var webViewPrefab = GameObject.Find("WebViewPrefab").GetComponent<WebViewPrefab>();
    // Wait for the WebViewPrefab to initialize, because the WebViewPrefab.WebView property
    // is null until the prefab has initialized.
    await webViewPrefab.WaitUntilInitialized();
    // Send a message after the page has loaded.
    await webViewPrefab.WebView.WaitForNextPageLoadToFinish();
    webViewPrefab.WebView.PostMessage("{\"type\": \"greeting\", \"message\": \"Hello from C#!\"}");
}

在网页端,通过对象?message事件监听消息的 JavaScript : 

if (window.vuplex) {
    addMessageListener();
} else {
    window.addEventListener('vuplexready', addMessageListener);
}function addMessageListener() {
    window.vuplex.addEventListener('message', function(event) {
        let json = event.data;
        // > JSON received: { "type": "greeting", "message": "Hello from C#!" }
        console.log('JSON received: ' + json);
    });
}

网页向Unity发消息

3D WebView 有一个内置的window.vuplex.postMessage() JavaScript API,可用于将消息从 网页发送到 Unity。由于它内置在浏览器中,因此您无需在页面中包含任何第三方脚本即可使用它。以下为发消息示例脚本:

// The window.vuplex object gets created when the page starts loading,// so we double-check that it exists before using it here.// You can skip this step if you're sending a message after the page has loaded.
if (window.vuplex) {
    // The window.vuplex object already exists, so go ahead and send the message.
    sendMessageToCSharp();
} else {
    // The window.vuplex object hasn't been initialized yet because the page is still
    // loading, so add an event listener to send the message once it's initialized.
    window.addEventListener('vuplexready', sendMessageToCSharp);
}function sendMessageToCSharp() {
    // This object passed to postMessage() automatically gets serialized as JSON
    // and is emitted via the C# MessageEmitted event. This API mimics the window.postMessage API.
    window.vuplex.postMessage({ type: 'greeting', message: 'Hello from JavaScript!' });
}

在Unity端通过MessageEmitted 事件的监听来接收网页发送过来的消息。
Unity 中接收该消息脚本示例:

async void Start() {
    // This assumes that there's a WebViewPrefab already in the scene.
    var webViewPrefab = GameObject.Find("WebViewPrefab").GetComponent<WebViewPrefab>();
    // Wait for the WebViewPrefab to initialize, because the WebViewPrefab.WebView property
    // is null until the prefab has initialized.
    await webViewPrefab.WaitUntilInitialized();
    webViewPrefab.WebView.MessageEmitted += (sender, eventArgs) => {
        // > JSON received: { "type": "greeting", "message": "Hello from JavaScript!" }
        Debug.Log("JSON received: " + eventArgs.Value);
    };
}

其它

Unity模拟点击网页

通过click函数来实现:

void?Click(Vector2?normalizedPoint,?bool?preventStealingFocus?= false)

示例脚本:

// Click in the exact center of the page.
webViewPrefab.WebView.Click(new Vector2(0.5f, 0.5f));
// Click in the upper right quadrant of the page// and prevent stealing focus from another webview.
webViewPrefab.WebView.Click(new Vector2(0.75f, 0.25f), true);

只不过normalizedPoint是采用标准化点而不是像素坐标,即Vector2? 每个元素的取值范围 0–1。

Unity操作网页文本

选择所有文本,具体取决于页面的焦点元素

webViewPrefab.WebView.SelectAll();

将选定的文本复制到剪贴板:

webViewPrefab.WebView.Copy();

将选定的文本复制到剪贴板并将其删除: 

webViewPrefab.WebView.Cut();

<think>嗯,用户在使用Unity3D WebView插件时遇到了网页无法调用摄像头的问题。首先,我需要回忆一下这个插件的基本情况。3D WebView支持WindowsmacOS上嵌入网页,但涉及到硬件访问,比如摄像头,可能会有权限问题或者平台限制。 接下来,用户的问题可能涉及多个方面。第一,插件的官方文档是否有提到关于摄像头支持的内容?可能需要检查插件是否支持WebRTC,因为摄像头通常通过WebRTC API访问。如果插件底层使用浏览器引擎不支持WebRTT或者相关API,那可能无法调用摄像头。 然后,考虑平台差异。WindowsmacOS的处理方式可能不同,比如权限请求的方式。在Unity编辑器中运行时,可能没有正确处理权限请求,导致摄像头无法启用。用户是否在真机上测试过?有时候编辑器中的行为与实际构建后的应用不同。 还有,浏览器的安全策略。如果网页是通过HTTP而不是HTTPS加载的,现代浏览器可能会阻止访问摄像头,因为安全策略要求HTTPS。需要确认用户加载的网页是否使用HTTPS,或者是否在本地环境中(如localhost)允许摄像头访问。 另外,Unity的配置可能也需要调整。比如,在Player Settings中是否启用了摄像头权限?特别是对于macOS,可能需要手动添加摄像头使用权限的描述,并在Info.plist中配置相应的权限请求。 用户可能已经按照基本步骤设置了,但忽略了某些细节。比如,在构建应用后,操作系统级别的权限是否被正确触发?有时候应用首次访问摄像头时需要用户授权,但如果应用没有正确触发权限请求,用户可能无法看到授权对话框,导致摄像头无法使用。 还有可能是插件本身的限制。某些插件可能在3D渲染上下文中不支持硬件加速或者特定的API调用。需要查看插件的论坛或支持页面,看看是否有其他用户遇到类似问题,或者是否有已知的解决方案。 最后,建议用户逐步排查:检查HTTPS、确认权限设置、测试实际构建的应用而非编辑器环境、查看控制台错误信息,以及联系插件技术支持。可能需要用户提供更多细节,比如使用插件版本、Unity版本、操作系统版本,以及是否有错误日志等,来进一步缩小问题范围。</think>关于在Unity使用3D WebView插件嵌入网页时摄像头调用失效的问题,以下是逐步排查与解决方案: 1. **HTTPS安全协议要求** - 现代浏览器要求通过HTTPS协议访问网页才能调用摄像头 - 解决方案: ```csharp // 在初始化时强制使用HTTPS webViewPrefab.Initialized += (sender, e) => { webViewPrefab.WebView.LoadUrl("https://your-website.com"); }; ``` 2. **Unity播放器权限设置** - 需要手动启用摄像头权限: - 在Player Settings > Other Settings中找到: - **WebCam**(启用该选项) - 对于macOS额外操作: - 编辑Info.plist文件添加: ```xml <key>NSCameraUsageDescription</key> <string>需要摄像头权限进行视频交互</string> ``` 3. **操作系统权限管理** - Windows系统需要: 1. 进入系统设置 > 隐私 > 相机 2. 确保Unity应用在「允许访问相机的应用」列表中处于启用状态 - macOS系统需要: 1. 进入系统偏好设置 > 安全性与隐私 > 相机 2. 在应用列表中找到并勾选Unity生成的可执行文件 4. **本地测试特殊处理** - 如果使用本地文件协议(file://): ```csharp // 启用本地测试模式 webViewPrefab.WebView.SetLocalTesting(true); ``` - Chrome需单独设置(Windows): ``` 地址栏输入:chrome://flags/#unsafely-treat-insecure-origin-as-secure 添加你的本地地址:http://localhost:8080 ``` 5. **控制台错误诊断** - 通过以下代码捕获控制台输出: ```csharp webViewPrefab.WebView.ConsoleMessageLogged += (sender, e) => { Debug.Log($"JS Console: [{e.Level}] {e.Message}"); }; ``` 6. **备选渲染方案尝试** - 在初始化时切换渲染模式: ```csharp webViewPrefab.WebView.SetRenderingEnabled(false); // 禁用GPU加速 ``` 7. **浏览器引擎兼容性验证** - 在插件初始化代码后添加版本检测: ```csharp webViewPrefab.WebView.LoadHtml(@" <script> console.log('UserAgent:', navigator.userAgent); console.log('WebRTC支持:', !!navigator.mediaDevices); </script> "); ``` **典型问题排查流程:** 1. 确认使用HTTPS协议加载网页 2. 检查Unity播放器设置中的摄像头权限 3. 验证操作系统级别的权限设置 4. 在真机上测试构建后的应用程序(非编辑器模式) 5. 查看控制台输出的具体错误代码 6. 尝试切换软件渲染模式 如果问题仍未解决,建议: 1. 在插件初始化时添加超时检测: ```csharp IEnumerator CheckCameraTimeout() { yield return new WaitForSeconds(5); if(!webViewPrefab.WebView.IsCameraAccessAllowed) { Debug.LogError("摄像头请求超时"); } } ``` 2. 联系技术支持时提供以下信息: - 插件版本号(例如:3D WebView v2.4.1) - Unity版本(例如:2021.3.6f1) - 目标平台Windows/macOS具体版本) - 控制台输出的完整错误日志 注意:部分企业级应用场景可能需要申请解除WebRTC限制,这种情况需要直接联系插件开发商获取定制支持
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值