Unity渲染流
关于Unity渲染流
此软件包包含基于我们的Unity渲染流构建的公共API和项目示例。使用此软件包,我们可以快速开发点对点流媒体解决方案。
主要功能
此软件包提供以下主要功能。
- 视频流媒体
- 音频流媒体
- 远程控制
视频流媒体
我们可以通过网络将在Unity上渲染的视频广播到浏览器。例如,可以在iPad的浏览器上显示使用HDRP渲染的视频。此外,还支持从多个摄像头进行广播。
音频流媒体
此软件包支持流式传输在Unity上生成的声音,并且可以同时向多个浏览器投放。
远程控制
可以从浏览器向Unity发送输入消息,并支持从多个浏览器发送输入。浏览器上支持鼠标、键盘、触摸和游戏手柄作为输入设备。
系统要求
这个版本的渲染流媒体与以下版本的Unity编辑器兼容:
- Unity 2020.3
- Unity 2021.3
- Unity 2022.3
- Unity 2023.1
平台
- 仅支持 Windows(x64)
- Linux
- macOS(支持Intel和苹果硅片)
- iOS
- Android(仅支持ARM64,不支持ARMv7)
注意
此软件包依赖于WebRTC软件包。如果您要为移动平台(iOS/Android)构建,请查阅软件包文档以了解构建的要求。
浏览器支持
Unity渲染流媒体支持几乎所有可以使用WebRTC的浏览器。
Browser | Windows | Mac | iOS | Android |
---|---|---|---|---|
Google Chrome | ✅ | ✅ | ✅ | |
Safari | ✅ | ✅ | ||
Firefox | ✅ | |||
Microsoft edge (Chromium based) | ✅ |
注意
由于依赖于对WebRTC的支持状态,它可能在某些浏览器上无法正常工作。
注意
在Safari和iOS Safari中,WebRTC功能不能通过http使用。必须使用https。
概述
以下是对Unity渲染流媒体系统的一般概念的解释。
系统结构
渲染流媒体系统由以下三个组件组成。
- 信号服务器
- 节点1(发送者)
- 节点2(接收者)
在渲染流媒体中,两个节点之间创建了一个P2P网络,该网络发送视频/音频/二进制数据。Web服务器使两个节点之间的通信成为可能。这种通信称为信号传递。
信号处理过程
以下是对信号处理方式的解释。
- 对等方1将Offer SDP发送到信号服务器。
- 对等方2检查信号服务器以获取未处理的Offer SDPs,并接收找到的任何SDP。
- 对等方2将Answer SDP发送到信号服务器。
- 对等方1检查信号服务器以获取未处理的Answer SDPs,并接收找到的任何SDP。
- 对等方1将ICE候选发送到信号服务器。
- 对等方2检查信号服务器以获取未处理的ICE候选,并接收找到的任何候选。
- 对等方2将ICE候选发送到信号服务器。
- 对等方1检查信号服务器以获取未处理的ICE候选,并接收找到的任何候选。
- 对等方之间的连接建立完成,对等方1可以向对等方2发送流。
教程
本页面描述了如何创建一个使用Unity渲染流技术的场景,并向您介绍帮助您通过流媒体在浏览器上呈现3D内容的关键功能。
开始之前
- 请阅读需求以了解限制。
- 本教程使用localhost和端口80作为信号服务器。如果您想更改地址和端口号,请阅读信号设置页面。
从模板创建Unity项目
1:打开Unity Hub。
2:转到项目(Projects),并选择新建项目(New Project)。
3:打开核心(Core )标签页,选择第三人称(Third Person)。
4:输入项目名称(Project name)。
5:选择创建项目(Create Project)。
Unity将创建一个项目,当Unity打开模板项目后,您可以看到Playground场景。
此模板设计用于多个平台,因此它是面向流媒体项目的良好起点。如果您想要实现高端图形效果,我们推荐使用HDRP样本模板。
Unity渲染流设置
1: 在菜单栏中选择窗口(Window) > 包管理器(Package Manager)。
2: 检查包管理器窗口,点击+按钮并选择通过名称添加包(Add package by name)。如果您使用的是Unity 2020.3,请选择从git URL添加包(Add package from git URL)。
3: 在输入框中输入以下字符串。
1 | com.unity.renderstreaming |
4: 安装包后,渲染流向导窗口将自动打开。选择全部修复(Fix All)。
5: 在Unity编辑器中选择播放(Play)。
启动网页应用程序
1: 在渲染流向导窗口中选择下载最新版本的网页应用(Download latest version web app)。
2: 启动应用程序。
如果您能在控制台中看到如下日志,则表示启动成功。
从浏览器连接:
1: 启动浏览器。
请查看需求页(Requirements page)中支持的浏览器列表。
2: 在浏览器中访问http://127.0.0.1。
3: 选择接收者示例(Receiver Sample)。
4: 选择播放(Play)。
您可以在浏览器中看到游戏视图,鼠标和键盘输入将影响游戏视图。
从移动浏览器连接:
1: 该项目包含虚拟游戏手柄。请在层级窗口(Hierarchy window)中选择 UI_Canvas_StarterAssetsInputs_Joysticks,并设置为激活状态。
您可以在游戏视图(Game View)中看到游戏手柄。
2: 从移动浏览器连接时,必须在信号服务器上启用SSL证书。请参阅此页面。
3: 使用创建的证书启动信号服务器。请在此处查看Web服务器的选项。
4: 将Web服务器的新URL设置到项目设置窗口(Project Settings window)中的信号设置(Signaling Settings)。
5: 在Unity编辑器中选择播放(Play)。
6: 从移动浏览器访问网页。
如果您看到如下的警告页面,也不必担心。
开发流媒体应用程序
本节将指导您通过从一个空的Unity项目开始,逐步创建一个简单的流媒体应用程序。
创建场景
本教程解释了如何在Unity编辑器中编辑一个空场景,并将摄像机渲染的图像显示到浏览器中。
更改项目设置
本页描述的程序假设不使用自动流媒体功能。请按以下步骤关闭该功能。
1: 打开项目设置窗口(Project Settings)。
2: 选择渲染流媒体(Render Streaming)标签。
3: 选择创建新设置资产(Create New Settings Asset)。
4: 以任意名称保存资产。
5: 禁用自动流媒体功能(Automatic Streaming)。
设置组件
如果Unity版本是2020年或更晚版本,请创建一个新的空场景。从菜单中选择文件(File) > 新建场景(New Scene)以打开对话框,并选择基础场景(Basic (Built-in))。
在层级窗口(Hierarchy window)中选择主摄像机对象(Main Camera),然后在检查器窗口(Inspector window)中添加信号管理器组件(Signaling Manager component)。
接下来,我们将向主摄像机对象(Main Camera)添加广播组件(Broadcast component)。该组件负责将流传输到多个对等方。
将广播组件(Broadcast component)分配给渲染流组件(Render Streaming component)的处理器属性(Handler property)。
在主摄像机对象(Main Camera)上添加一个视频流发送组件(Video Stream Sender component)。此组件引用摄像机,并将其作为流传输给其他对等方。
将视频流发送组件(Video Stream Sender component)分配给广播组件(Broadcast component)的相应属性。并设置摄像机。
在浏览器中检查
打开接收者示例页面(Receiver Sample page),你应该能在浏览器中看到来自Unity摄像机的视频。
下一步
你已经可以将视频从Unity传输到浏览器了。同样,也可以传输音频。有几种类型的组件可以被流式传输。请查看组件页面以获取详细信息。
设置设备输入
为了在远程PC上控制摄像机,我们需要将Web浏览器上的输入事件与Unity中的动作关联起来。输入系统(Input System)使得输入处理的实现变得简单。
检查输入系统的设置
首先,请检查关于输入系统设置的向导窗口。
添加用于输入处理的组件
打开之前页面创建的Unity场景,并在层级窗口(Hierarchy window)中选择主摄像机(Main Camera)。在检查器窗口(Inspector window)中添加输入接收器组件(Input Receiver component)。
输入接收器组件(Input Receiver)的初始条件如下所示。
将 Input Receiver 组件添加到 Broadcast 组件的属性中。
设置输入动作
我们将使用输入系统的输入动作功能。输入动作是一种将各种输入映射到 Unity 动作的机制,并且它提供了易于使用的编辑工具。我们将使用输入动作来定义鼠标动作。
在项目窗口中右键点击,然后选择 创建(Create ) > 输入动作( Input Actions)。
该资源将被添加到项目窗口中,并重命名为 Control。双击项目窗口中的 Control 资源,将会打开动作编辑器。
点击动作映射中的 + 按钮以添加一个项目。
将动作(Actions )项重命名为 Look。
选择该项,将动作类型(Action Type)更改为Value,控制类型(Control Type)更改为Vector2。
接下来,选择
结果将如下所示。请注意,最后一步是按下保存资源(Save Asset)按钮以保存您的编辑。
设置 InputReceiver 组件
将 Control 资产拖到 InputReceiver 组件的 Input Actions 属性上。
添加代码以控制相机的旋转。移动到 Inspector 窗口,点击 Add component 按钮并选择 New Script 来创建资产。将资产名称更改为 PlayerControler。
脚本的内容如下所示。
1 | using UnityEngine; |
将脚本复制并保存文件后,将 PlayerController.Look 分配给 InputReceiver 组件的 Look 事件。
在浏览器中检查
浏览器中的鼠标操作应该反映在相机的旋转上。如果相机没有移动,请检查向导窗口上的设置。
示例
请查看此页面。