当前位置:首页 > 每日看点

unity3D 项目如何实现与网页的交互?

卡卷网2年前 (2024-12-20)每日看点300

Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。这项技术为在 Unity 项目中创建动态交互式元素提供了可能性,例如游戏内浏览器、菜单、聊天、内部 Wiki 或实时数据显示。

要在项目中实现此功能,您需要将 Web 视图集成到 Unity 中。DotNetBrowser 是一个单独的 .NET 库,用于加载和渲染网页,并支持 .NET Standard 2.0,因此可以集成到 Unity 中。

unity3D 项目如何实现与网页的交互?  第1张

在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。

DotNetBrowser(DotNetBrowser试用下载是一个.NET库,允许将基于Chromium的WPF和WinForms组件嵌入到.NET应用程序中,以显示使用HTML5,CSS3,JavaScript,Silverlight等构建的现代网页。

unity3D 项目如何实现与网页的交互?  第2张

基于FPS Microgame模板的项目中HTML聊天和游戏菜单。

设置 Unity 项目

首先,确保您的 Unity 环境已设置并可供使用。打开 Unity Hub 并为 Windows、macOS 或 Linux 创建一个新的 3D 项目。

安装 DotNetBrowser

要将 DotNetBrowser 依赖项作为包安装,请执行以下操作:

  • 在 Unity 编辑器顶部菜单中,单击“窗口 → 包管理器”菜单项,打开包管理器。
  • 在包管理器窗口中,点击左上角的“+”按钮,选择“从 git URL 安装包...”菜单项。
  • 粘贴下面给出的包 URL,然后按“安装”按钮。

https://github.com/TeamDev-IP/DotNetBrowser-Examples.git?path=csharp/unity3d/Dependencies

  • 等待软件包安装完成并且 DotNetBrowser 依赖项恢复。安装的软件包应如下所示:

unity3D 项目如何实现与网页的交互?  第3张

安装了 DotNetBrowser 依赖包的包管理器。

  • 关闭包管理器。您已完成此步骤。

创建材质来显示网状纹理

在将网页内容渲染到 3D 对象之前,您需要创建一种将网页显示为纹理的材质。

  • 创建新材质:
  1. 在“Assets”文件夹中单击鼠标右键,选择“创建 → 材质”,并将其命名为“WebTextureMaterial”。
  2. 设置着色器并为其添加纹理。“Unlit/Texture”着色器适合我们的任务。
  3. 将“Tiling X”设置为 -1。这是必要的,因为 Chromium 发送的是按 X 反转的像素数据。

unity3D 项目如何实现与网页的交互?  第4张

  • 创建平面:
  1. 向场景中添加一个平面。您可以通过进入顶部菜单并选择“GameObject → 3D Object → Plane”来执行此操作。
  2. 面对场景摄像机。
  3. 将材质拖到平面上。此材质将显示网页内容。

将网页内容渲染为纹理

现在,您需要将网页或 HTML 内容渲染为可应用于材质的纹理。

  1. 创建脚本来处理网页内容。创建一个新的 C# 脚本(在“Assets → Create → Empty C# Script”中单击右键并命名BrowserScript)。
  2. 编写代码以加载和渲染网页内容。以下是初始化 DotNetBrowser 以在纹理上渲染网页的示例脚本:

using DotNetBrowser.Browser; using DotNetBrowser.Browser.Widgets.Handlers; using DotNetBrowser.Engine; using DotNetBrowser.Geometry; using DotNetBrowser.Handlers; using DotNetBrowser.Ui; using UnityEngine; using Color = DotNetBrowser.Ui.Color; namespace Assets.Scripts { public class BrowserScript : MonoBehaviour { private Texture2D texture; // The URL to render. public string DefaultUrl = "https://html5test.teamdev.com"; // The default browser width. public uint Width = 1024; // The default browser height. public uint Height = 768; // The latest rendered bitmap data of the browser web page. public Bitmap Bitmap { get; private set; } // An instance of IBrowser controlled by this script. public IBrowser Browser { get; private set; } // An instance of IEngine controlled by this script. public IEngine Engine { get; private set; } public void Awake() { // Initialize the DotNetBrowser engine. EngineOptions engineOptions = new EngineOptions.Builder { LicenseKey = "your_license_key", RenderingMode = RenderingMode.OffScreen }.Build(); Engine = EngineFactory.Create(engineOptions); // Create a browser instance. Browser = Engine.CreateBrowser(); // Set the browser size and transparency. Browser.Size = new Size(Width, Height); Browser.Settings.TransparentBackgroundEnabled = true; Browser.Settings.DefaultBackgroundColor = new Color(0, 0, 0, 0); // Conp rendering the browser content // and save the rendered image. var provider = (IOffScreenRenderProvider)Browser; provider.PaintHandler = new Handler<PaintParameters>(p => Bitmap = p.View); provider.Show(); } public void OnDestroy() => Engine?.Dispose(); public void Update() { if (Bitmap == null) return; int newWidth = (int)Bitmap.Size.Width; int newHeight = (int)Bitmap.Size.Height; if (texture == null || texture.width != newWidth || texture.height != newHeight) { texture = new Texture2D(newWidth, newHeight, TextureFormat.BGRA32, true); var render = gameObject.GetComponent<MeshRenderer>(); render.material.mainTexture = texture; } texture.SetPixelData((byte[])Bitmap.Pixels, 0); texture.Apply(true); } public void Start() { Browser.Navigation.LoadUrl(DefaultUrl); } } }

分配脚本并测试

将脚本附加到您之前创建的平面。使用脚本和材质,您的平面的检查器窗格应如下所示:


unity3D 项目如何实现与网页的交互?  第5张

在 Unity 中播放场景。现在应该会在您应用于平面的材质上渲染网页内容。如果您已正确完成所有操作,则应该看到以下内容:

unity3D 项目如何实现与网页的交互?  第6张

使网页内容具有交互性

您可以进一步为网页内容添加交互性。例如,您可以让用户使用鼠标或触摸屏与网页进行交互。

您可能需要捕获用户点击、鼠标移动或触摸事件,以将其传递给 Web 内容进行交互。

在 Unity 中捕获鼠标点击的最简单方法是将OnMouseDown() 和OnMouseUp()方法添加到BrowserScript:

// Get the current mouse point in browser coordinates. private Point GetMousePoint() { // Ensure the main camera exists on the scene. if (Camera.main != null) { // Create a ray from the camera's position // through the current mouse position on the screen. var ray = Camera.main.ScreenPointToRay(Input.mousePosition); // Perform a raycast to detect collision // with objects on the scene. if (Physics.Raycast(ray, out RaycastHit hit)) { // Calculate the coordinates in the browser space. // Since "Tiling X" is -1, the X coordinate is inverted. int x = (int)(Width * (1 - hit.textureCoord.x)); int y = (int)(Height * hit.textureCoord.y); return new Point(x, y); } } // Return null if no valid point could be calculated // (e.g., no camera or no raycast hit). return null; } // OnMouseDown is called when the user presses the mouse button // while over the collider. public void OnMouseDown() { var location = GetMousePoint(); if (location == null) return; var args = new MousePressedEventArgs { Location = location, // OnMouseDown is called for the left clicks only. Button = MouseButton.Left, ClickCount = 1 }; Browser.Mouse.Pressed.Raise(args); } public void OnMouseUp() { var location = GetMousePoint(); if (location == null) return; var args = new MouseReleasedEventArgs { Location = location, Button = MouseButton.Left, ClickCount = 1 }; Browser.Mouse.Released.Raise(args); }

Unity 提供了许多用于捕获用户输入的选项,DotNetBrowser 拥有将键盘、触摸和鼠标事件传递到浏览器所需的所有 API。

优化性能

在 Unity 中渲染 Web 内容可能会占用大量资源。要优化性能,请执行以下操作:

  • 如果没有必要,请避免渲染大型浏览器图像:浏览器大小也是纹理大小,大纹理会对整体性能产生影响。
  • 优化网页内容:确保您呈现的网页针对快速加载和最少资源使用进行了优化。
  • 调整帧速率:通过防止不必要的纹理更新来限制浏览器渲染的帧速率或刷新率。例如,如果位图未由 DotNetBrowser 更新,则无需更新纹理像素。

结论

在 Unity3D 中将 Web 内容渲染到纹理上,您可以创建游戏内浏览器、基于 Web 的交互式仪表板,甚至是实时流式传输内容。使用 DotNetBrowser 等库,将 Web 内容直接集成到 Unity 项目中相对容易。按照以上步骤操作,您可以开始尝试不同的 Web 内容,将其与 Unity 集成,并为交互式 3D 应用程序开辟新的可能性。

本指南为您提供了在 Unity 中将 Web 内容显示为纹理的坚实基础。无论您是在构建虚拟现实项目、游戏还是交互式应用程序,这些技术都可以显著提升用户体验。

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/5027.html

分享给朋友:

相关文章

下班后可以做点什么副业赚钱呢?

下班后可以做点什么副业赚钱呢?

首先说明一下,我分享的任务不需要交钱,也不需要入群,只需要你去平台学习就可以。如果有任何让你交钱,进群的任务,请警惕被 割韭菜 。今天给大家分享 7大赚钱副业,新手小白0粉丝 0门槛0技术都可以去做,不说大富大贵,但是赚个零花钱还是可以。如…

PS有哪些实用小技巧,小白也能一学就会?

PS有哪些实用小技巧,小白也能一学就会?

不看后悔系列!本篇分享25个PS实用的技巧! 不能保证每个都能让你惊艳,但是却是我用心写出来的,希望对你有帮助。 另外我的知乎也写了接近200篇PS的技巧,超级合集分享! 我目前正在带一个PS/Ai的软件训练营,两个多月搞定两大软件的学…

你手机里有哪些堪称神器的 App?

你手机里有哪些堪称神器的 App?

嗨嗨,我是赢酱~ 首先我认为对于我们有用的提升自我的都是手机里的神器 App。 一个人应该什么样子呢?在我从女孩子的角度看来,自律,上进,会打扮,情商高,会挣钱,独立,落落大方,这才是应该有的样子,我们可以借助手机不断学习改变 今天给大家准…

手机的运行内存真的有必要上16GB吗?

全是国产垃圾APP惯出来的。 那些对国产软件没意见的人,建议出国看看,花不了多少钱,出门开 Google Map,订宾馆用 Booking,翻译用 Google translate,聊天用 Telegram,社交活动用 Discord,你会…

你捡过最大的漏是什么?

你捡过最大的漏是什么?

买了套二手房,软磨硬泡便宜了1个w 结果就是一屋子狼藉 原业主说反正你们要重新装修 就不收拾了 等完了你们一起收拾掉吧 落了很多柜子 电器是啥的 今天打开卧室柜子一看… 现在是去存钱的路上 有朋友知道这样存钱银行会给发大米跟油吗…

提升自己最快的方式是什么?

提升自己最快的方式是什么?

1. 稻盛和夫说过: “改变自己最快的方法就是做自己害怕的事,不敢做的事,认为自己做不到,觉得不可能的事。如果在自己的舒适区待久了,就会丧失斗志,如果想快速的改变,可以坚持去做一些对自己有益的事。 2. 早睡早起,坚持运动 保持旺盛的精力,…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。