(四)Photon Voice2 的使用

news2024/11/13 18:41:27

一、入门

1.Voice简介

Photon Voice 2 是一个 SDK,可以轻松地向 Unity 应用程序添加高质量的低延迟语音聊天。它建立在 Photon Realtime 之上,并继承了它的所有功能,包括配对和兴趣小组。客户端加入房间并创建传出流(本地语音),房间中的所有其他客户端都可以接收到该流。兴趣小组可用于将流媒体限制为房间内的小组成员。
Photon Voice 2 可以单独使用,也可以与其他 Photon 或第三方组件结合使用。对于 photon unity networking (pun2) 和 photon fusion,SDK 提供了集成模块。
默认情况下,通过 Unity API 捕获和播放音频。还可以使用支持硬件音频处理的 Photon 原生麦克风模块捕获音频,包括声学回声消除 (AEC)。 Photon Voice 2 API 允许与第三方输入和输出模块进行自定义集成。随 SDK 提供的 FMOD 输入和输出模块就是此类集成的示例。
一个简单的音频处理 API 可用于轻松集成第三方音频处理组件(DSP、口型同步、语音识别等)。这种集成的一个显着示例是增强捕获音频质量的 webrtc 音频软件处理组件,这在硬件音频处理不可用时非常有用。
加入我们的 discord 服务器,在可用时与社区或我们的团队成员之一聊天。 

2.支持的平台

  • Windows
  • UWP
  • macOS
  • Linux
  • Android (for 64-bit support read this)
  • iOS
  • WebGL (experimental, Unity 2021.2 or higher required, Safari is not supported)
  • PlayStation 4 (requires a special add-on that can be downloaded here. Read more about access to consoles here.)
  • PlayStation 5 (requires a special add-on that can be downloaded here. Read more about access to consoles here.)
  • Nintendo Switch (requires a special add-on that can be downloaded here. Read more about access to consoles here.)
  • MagicLeap (Lumin OS, requires a special add-on that can be downloaded here. Read more about Magic Leap here.)
  • HoloLens 2 (ARM64 requires a special add-on that can be downloaded here.)
  • Xbox One (requires a special add-on that can be downloaded here. Read more about access to consoles here.)
  • Xbox Series X and Xbox Series S (requires a special add-on that can be downloaded here. Read more about access to consoles here.)

3.脚本后端兼容性

Photon Voice 与 IL2CPP 配合使用效果最佳。不完全支持单声道。

4.安装说明

所需的最低 Unity 版本是 2019.4 LTS。
Photon Voice 2 可以从此处的 Unity Asset Store 下载和导入。
Photon Voice 2 软件包 包括 PUN2。 PUN2 已经包括依赖于它的 Photon Realtime Unity SDK、Photon Chat 和 Photon Unity 库。如果你愿意,你可以清理 PUN2 或从项目中清理 Photon Chat,但 Photon Voice 需要其他部分才能工作。
为了与其他 Photon 包兼容并保证顺利更新,我们不建议将 Photon 资产移出根 Photon 文件夹(“Assets\Photon”)。
Photon Voice 2 与 PUN Classic 不兼容。 Photon Voice Classic 将与 PUN Classic 一起使用,但两个软件包都将很快消失。

5.Clean Import

为避免在已包含 PUN2 的项目中导入 Photon Voice 2 时因版本不匹配而导致任何冲突错误,建议先清理 Photon 资产:
如果您不使用其他 Photon 包(例如 Photon Bolt),请删除“Assets\Photon”文件夹。
如果您并行导入了另一个 Photon 包,则删除以下文件夹:

  • "Assets\Photon\PhotonChat"
  • "Assets\Photon\PhotonRealtime"
  • "Assets\Photon\PhotonUnityNetworking"
  • "Assets\Photon\PhotonLibs"

如果您想在更新 Photon Voice 2 或导入另一个 Photon 包后遇到问题后进行干净导入,也可以按照此步骤操作。

6.Update

我们不建议在 Photon Voice 2 之上导入 PUN2。我们总是尝试在 PUN2 更新后立即发布 Photon Voice 2 版本,以便您可以从 Photon Voice 2 获得最新的 PUN2。
如果您在从 Unity Asset Store 更新 Photon Voice 2 时遇到问题,请尝试进行干净导入。

7.关键组件

(1)Recorder

Recorder是采集音源、压缩音频数据并在房间内播放的组件。

(2)Speaker

Speaker 组件及其变体(SpeakerAudioFilterRead、SpeakerFMOD)播放传入的音频流。默认实现使用 Unity 的 AudioSource 组件。 VoiceConnection 实例负责在需要时实例化 Speaker,并将传入的音频流路由到适当的 Speaker 实例。

(3)Speaker Jitter Buffer

扬声器使用抖动缓冲器来补偿数据包传输时间的变化。使用 Speaker.PlayDelay 属性以毫秒为单位调整抖动缓冲区的大小。默认值为 200 毫秒。值越高,音频录制和播放之间的延迟越大。另一方面,太低的值可能会导致播放中断。

(4)VoiceConnection

场景中需要一个 VoiceConnection 实例才能将语音客户端连接到 Photon 服务器。 SDK目前提供了3种VoiceConnection实现:UnityVoiceClient、punvoiceclient、fusionvoiceclient。

(5)UnityVoiceClient

仅维护语音室连接的 VoiceConnection 实现。

(6)Application Settings

UnityVoiceClient.UseVoiceAppSettings:如果为真,则使用全局 VoiceAppSettings 对象的设置。否则,在“App Settings”折页中设置特定于此 UnityVoiceClient 组件的值。

(7)Streaming

UnityVoiceClient.PrimaryRecorder:如果设置,附加到此对象的录音机将自动初始化并用于流式传输。
UnityVoiceClient.SpeakerPrefab:当检测到新的传入流时,将用于实例化扬声器对象的预制件。必须包含 Speaker 组件。

8.如何使用

  1. 将 UnityVoiceClient 组件添加到场景中的对象。
  2. 在全局 VoiceAppSetting 对象中设置 App Id Voice(单击具有该名称的按钮可访问它)或取消选中 Use Voice 的 App Settings 并直接在 UnityVoiceClient 中设置 App Id Voice。
  3. 将 Recorder 添加到场景,并将其分配给 VoiceConnection.PrimaryRecorder 字段。
  4. 添加 Speaker 预制件(具有 Speaker 组件的预制件)并将其分配给 VoiceConnection.SpeakerPrefab 字段。
  5. 添加一个脚本,使用 VoiceConnection 组件上的 Photon Realtime API 将客户端加入房间(例如,参见“ConnectAndJoin.cs”实用程序脚本)。
  6. 在不同的设备上运行该应用程序的多个实例:现在它们在聊天室中并且可以相互通信。
  7. 您还可以在房间中仅使用一个客户端测试应用程序:从代码或在编辑器中将 Recorder.DebugEchoMode 字段设置为 true。传出流将被路由回客户端并通过 Speaker 实例播放。

9.如何移除PUN

如果您不需要 Photon Voice 2 包中包含的 PUN2,您可以将其删除。为此有一个编辑器快捷方式:“Window”->“Photon Voice”->“Remove PUN”。

或者,您可以按照以下步骤手动执行此操作:

  1. 删除“Demos\DemoVoicePUN”文件夹
  2. 删除“Photon\PhotonVoice\Code\PUN”文件夹
  3. 删除“Photon\PhotonUnityNetworking”文件夹
  4. 虽然这应该为您完成,但请确保在"Project Settings" -> "Player" -> "Other Settings" -> "Scripting Define Symbols"中,PHOTON_UNITY_NETWORKING,所有 PUN_2_X_OR_NEWER 和 PUN_2_OR_NEWER 都被删除。

您始终可以随时通过从Asset Store导入 Photon Voice 2 来添加文件。

 10.如何移除Photon Chat

如果你想在没有 Photon Chat 的情况下使用 Photon Voice,你可以将 Photon Chat 保留在你的项目中或简单地删除它。为此有一个编辑器快捷方式:“Window”->“Photon Voice”->“Remove Photon Chat”。

或者,您可以通过删除“Photon\PhotonChat”文件夹来手动执行此操作。
您始终可以随时通过从Asset Store导入 Photon Voice 2 来添加文件。 

二、Voice - PUN2集成

1.主要用途

每个Player都有一个网络实例化的 PUN 预制件(角色或头像),其中音频是 3D 定位的。音频流在语音室中与场景中的 PUN 预制实例同步创建。附加到网络对象的记录器产生音频流。附加到此网络对象的远程副本的扬声器使用音频流。 Photon View ID 用于为 Recorder 找到正确的 Speaker。
通过这种集成,还可以简单地使语音室跟随 PUN 室的状态,并通过 PunVoiceClient.Instance.PrimaryRecorder 流式传输,而不绑定到任何网络对象。

2.关键组件

(1)PunVoiceClient

保持连接并同步 2 个房间状态的语音连接的实现:Voice和 PUN。

PunVoiceClient 是一个单例:应该只存在一个实例。如果存在多个实例,则只保留一个,其他实例将被销毁。如果您从预制件添加 PunVoiceClient,请确保它被实例化一次。

(2)Application Settings

  1. PunVoiceClient.Instance.UsePunAppSettings:如果为真,则使用 PUN 的 PhotonNetwork.PhotonServerSettings 中的 AppSettings。否则,在“应用程序设置”折页中设置特定于 PunVoiceClient 单例的值。
  2. PunVoiceClient.Instance.UsePunAuthValues:如果为 true,语音客户端将使用与 PUN 的 PhotonNetwork.AuthValues 相同的 AuthenticationValues。这要求语音应用程序具有与 PUN 应用程序相同的自定义身份验证仪表板配置。

(3)Following The PUN State

  1. PunVoiceClient.Instance.AutoConnectAndJoin:如果PUN客户端加入房间,语音客户端也连接并加入相应的语音房间。
  2. PunVoiceClient.Instance.AutoLeaveAndDisconnect:如果PUN客户端离开房间,Voice客户端自动断开连接。

(4)Streaming

  1. PunVoiceClient.Instance.PrimaryRecorder:一个带有 Recorder 组件的对象,适用于每个客户端只有 1 个传出流的场景。
  2. PunVoiceClient.Instance.UsePrimaryRecorder:如果为 true,则附加到 Primary Recorder 对象的 Recorder 将自动初始化并用于流式传输。 Recorder 不会绑定到任何网络对象。如果您使用的是 PhotonVoiceView 预制件,请取消选中它。
  3. PunVoiceClient.Instance.SpeakerPrefab:当检测到新的传入流并且该流所属的对象在其层次结构中没有 Speaker 时,将用于实例化扬声器对象的预制件。如果您不使用 PhotonVoiceView 预制件或这些预制件没有扬声器组件,请设置它。必须包含 Speaker 组件。 

(5)PhotonVoiceView

分配给 PhotoView 预制件并负责设置Recorder和Speaker的组件。在流媒体方面,它启动在预制件层次结构中找到的 Recorder,如果没有找到,则启动 PunVoiceClient.Instance.PrimaryRecorder。在接收方,它启动在预制件层次结构中找到的 Speaker,或者如果没有找到,则从 PunVoiceClient.Instance.SpeakerPrefab 实例化它。

 3.建议的工作流程

(1)场景设置

  1. 在 PUN 的 PhotonServerSettings 的 AppSettings 中设置 Voice AppId。
  2. 将 PunVoiceClient 添加到场景中。
  3. 在场景中添加一个带有 Recorder 的对象,并将其分配给 PunVoiceClient.PrimaryRecorder。
  4. 创建一个带有 Speaker 的预制件并将其分配给 PunVoiceClient.SpeakerPrefab。

(2)预制设置

  1. 将 PhotonVoiceView 添加到附加了 PhotonView 的 PUN 预制对象。
  2. 加入房间后实例化此预制件。

 三、Recorder 组件

Recorder 是采集音频源,压缩音频数据并在房间内播放的组件。在大多数情况下,您只需要在场景中使用 1 个激活的Recorder,它是通过 VoiceConnection.PrimaryRecorder 或作为 PUN 或 Fusion 网络对象预制件的一部分设置的。

1.Input Audio Source

在编辑器或代码中的 Recorder.SourceType 字段中设置您想要流式传输的源。

2. Microphone Audio Source

系统中可用的麦克风之一用作源。

3.Microphone Types

在编辑器或代码中的 Recorder.MicrophoneType 字段中设置您想要使用的麦克风 API。
Unity:默认情况下,录音机在所有平台上使用 Unity 麦克风 API。此 API 可在多种平台上使用,但无法控制音频捕获硬件功能,尤其是声学回声消除 (AEC)。
Photon:使用Poton Voice 2提供的原生音频采集模块,主要平台有:Windows、UWP/Hololens、macOS、iOS、Android。内置硬件音频处理已启用,包括 AEC。

4.Microphone Type Fallback

 如果 Recorder.UseMicrophoneTypeFallback 在使用 Unity 麦克风类型开始录制失败时为真,则 Recorder 会尝试使用 Photon 麦克风类型作为后备,反之亦然。

5.Microphone Selection

如果系统中有多个麦克风,您可能希望通过从代码更新 Recorder.MicrophoneDevice 属性来切换默认麦克风。
对于 Unity 麦克风类型,使用 UnityEngine.Microphone.devices Unity API 属性获取设备列表并将 Recorder.MicrophoneDevice 属性设置为包含在 new Voice.DeviceInfo(device) 中的所选设备的名称。您还可以在 UnityEngine.Microphone.devices 周围使用 Voice.Unity.AudioInEnumerator 包装器。它返回 DeviceInfo 对象的列表。
对于光子麦克风类型,使用 Voice.Platform.CreateAudioInEnumerator() 调用创建一个设备枚举器,对其进行迭代并将 Recorder.MicrophoneDevice 属性设置为所选设备。请注意,枚举可用麦克风列表仅适用于 Windows、UWP 和 macOS。在 Android 和 iOS 上,Photon Microphone Type 使用系统选择的麦克风。

6.Audio Clip Audio Source

为了向加入同一房间的其他玩家播放音频剪辑,您需要将 Unity 支持的音频媒体文件分配给 Recorder.AudioClip。这可以通过从 Unity 编辑器拖放到Inspector来完成。

7.Factory Audio Source

Photon Recorder 允许您为您想到的任何用例拥有自己的自定义音频源。将 Recorder 的“InputFactory”属性设置为返回实现 Photon.Voice.IAudioReader 或 Photon.Voice.IAudioPusher 接口的对象的函数。如果您不分配“InputFactory”,则默认使用返回音调发生器的工厂。

8.Audio Codec Parameters

  1. Recorder.SamplingRate:流式音频的采样率。可能的值为:8、12、16、24 和 48 kHz。 16 Hz 足以用于语音,但将其设置得更高也无妨。默认值为 24 kHz。
  2. Recorder.FrameDuration:在一个网络数据包中传输的音频片段的长度(以毫秒为单位)。可能的值为 20、40 和 60 毫秒。较高的值会稍微增加延迟,同时减少传出数据包的数量,从而减少由于数据包开销而导致的带宽。默认值为 20 毫秒。
  3. Recorder.Bitrate:音频编解码器产生的每秒最大数据量(以比特为单位)。这定义了输出流的带宽并影响接收端的音频质量。默认值为 30000 b/s。

9. Other Stream Settings

  1. Recorder.Encrypt:如果为真,传出的音频流被加密。默认为假。在此处阅读有关“加密”的更多信息。
  2. Recorder.ReliableMode:如果为 true,则传出音频流以可靠模式传输。这可能会由于重传而引入显着的延迟,并且可能需要增加扬声器抖动缓冲区。默认为假。

 10.Recording And Transmission

为了成功广播音频,必须将以下两个属性设置为 true。

  1. Recorder.RecordingEnabled 属性定义 Recorder 是否正在录制、处理音频并压缩它。只要该属性为真,用于流式传输的资源就会在发送端和接收端进行分配。
  2. Recorder.TransmitEnabled 属性定义 Recorder 是否将压缩的音频数据发送到房间。用它来暂时静音流。

其他属性可以自动更新 Recorder.RecordingEnabled:

  1. 如果 Recorder.RecordWhenJoined 为 true,则 Recorder 在 VoiceConnection 加入房间时开始录音(将 Recorder.RecordingEnabled 设置为 true)并在离开时停止。
  2. 如果 Recorder.StopRecordingWhenPaused 为真,则 Recorder 在应用程序暂停时暂停录制(在 OnApplicationPause 中处理)。

11.Interest Groups

您可以为您的玩家提供同时进行多个对话而不会相互干扰的可能性。这可以使用“Interest Groups”来完成。兴趣组由数字(字节)标识。您可以订阅和取消订阅多个群组。但是,您一次只能向一个组传输音频。
默认情况下,记录器的兴趣组设置为 0:每个玩家都可以与其他人交谈。要设置目标兴趣组,请设置 Recorder.InterestGroup。
您可以选择多个要收听的群组。默认情况下,所有语音客户端仅订阅组 0。要更新您注册的群组列表,您可以使用 Realtimne API 中的以下方法:

VoiceConnection.Client.OpChangeGroups(byte[] groupsToRemove, byte[] groupsToAdd);

更改音频组时应考虑以下注意事项:

  1. 它只能在加入语音室时完成。
  2. 如果您不想添加或删除任何组,请在相应参数中传递一个空值。
  3. 如果要添加或删除所有现有组,请在相应参数中传递一个空数组 (byte[0])。
  4. 您无法取消订阅默认音频组 (0)。

12.Debug Echo Mode

当通过 Recorder.DebugEchoMode 属性启用此模式时,允许客户端传输的音频流由同一客户端接收。这对于在只有一个客户端加入房间的情况下快速测试应用程序很有用。
Debug Echo Mode 仅适用于 Interest Group 0。

13.Threshold-based Voice Detection

使用 Recorder.VoiceDetection 属性启用的语音检测会在音频信号电平低于预定义阈值时暂停传输,这通常发生在您停止说话时。这将有助于避免发送无用的噪音,从而减少流量。
阈值由 Recorder.VoiceDetectionThreshold 属性控制,默认值为 0,01。
要自动将阈值调整为实际背景噪声级别,请调用 Recorder.VoiceDetectorCalibrate(period),其中 period 是分析音频信号的时间。

14.Automatic Restart

在记录期间更改记录器的特定属性将导致记录重新启动(这会导致在下一帧停止并重新启动记录器)。以下是更改后会导致重启以使它们生效的公共字段或属性的列表:

  • Recorder.UserData
  • Recorder.InputFactory
  • Recorder.SourceType
  • Recorder.MicrophoneType
  • Recorder.MicrophoneDevice
  • Recorder.AudioClip
  • Recorder.SamplingRate
  • Recorder.FrameDuration
  • Recorder.Bitrate
  • Recorder.UseOnAudioFilterRead

15.Primary Recorder

由于在大多数情况下,使用单个 Recorder 组件,我们为称为 Primary Recorder 的单个默认 Recorder 提供了一个快捷方式,可以从 Unity Editor 中的 VoiceConnection.PrimaryRecorder 属性或通过代码访问它。如果设置了该属性,unityvoiceclient 始终会启用它:根据 Recorder 设置初始化并开始录音。
相比之下,punvoiceclient 和 fusionvoiceclient 仅在 VoiceConnection.UsePrimaryRecorder 为 true 时直接使用 Primary Recorder,这在您仅使用未绑定到任何网络对象的单个传出流跟随 PUN 或 Fusion 状态时非常有用。
如果 PUN 的 PhotonVoiceView 或 Fusion 的 VoiceNetworkObject 在场景中实例化并且其预制件没有 Recorder,则 Primary Recorder 会自动参与并绑定到网络对象。确保每个客户端只实例化一个这样的网络对象,以避免共享Primary Recorder。

16.More Recorders

如果由于任何原因,您需要使用多个 Recorder,请根据需要实例化它,设置它,然后使用 VoiceConnection.AddRecorder(Recorder) 方法开始使用它。

17.AudioChangesHandler Component

该组件检测音频硬件的变化并自动重新启动与其共享对象的记录器。手动添加或使用 Recorder Inspector 中的 Add Audio Changes Handler 组件按钮添加。
在移动平台上,如果 AudioChangesHandler.HandleDeviceChangeIOS 或 AudioChangesHandler.HandleDeviceChangeAndroid 属性设置为 true,则会处理更改。 AudioChangesHandler.HandleDeviceChange 属性适用于所有其他平台。

18.WebRTCAudioDsp Component

适用于所有主要平台的 WebRTC 音频本机库的包装器。大多数效果建议与 Unity 麦克风类型一起使用,因为使用 Photon 麦克风类型捕获的音频流通常已经由硬件处理过。尽管 WebRTCAudioDsp.VAD(语音自动检测)在输入信号中未检测到语音时暂停传输,但对任何麦克风源都很有用。
只有在创建传出流时 WebRTCAudioDsp.enabled 为真时,该组件才处于活动状态。
WebRTCAudioDsp.Bypass 属性可用于在组件处于活动状态时暂时禁用所有处理。

四、PUN Voice Demo

PUN 语音演示是一款简单的四人移动友好游戏,玩家可以在其中互相交谈。除了配对之外,该游戏还有 4 个不同的可玩角色和 3 个不同的摄像机视图。该演示基于 Unity 的教程“Survival Shooter”,可在 Photon Voice 包中获得。

1.安装

试用 PUN 语音演示:

  1. 从 Asset Store 下载包。
  2. 在 Unity 中打开项目并加载 DemoPunScene。
  3. 在 Unity Inspector 中打开 PhotonServerSettings(菜单:"Window" -> "Photon Unity Networking" -> "Highlight Server Settings"):
  4. 配置 PUN:从 Photon Realtime dashboard复制粘贴您自己的 Realtime AppId。
  5. 配置Voice:从 Photon Voice dashboard复制粘贴您自己的语音 AppId。
  6. 构建、运行并享受!

2.多个角色

与您的朋友一起尝试演示时,您会注意到每个玩家都有自己独特的角色,并且会在随机位置生成。这是使用 CharacterInstantiation 类处理的。在 OnJoinedRoom 回调中,我们根据演员编号和随机生成位置选择预制件。

3.连接和校准

在右下角,您可以找到校准和连接按钮。校准按钮仅在加入语音室时有效,可用于调整响度级别。阅读有关“校准”的更多信息。
另外两个按钮分别“连接”或“断开”PUN 或 Photon Voice。

 4.设置

通过使一些设置可以从 UI 轻松访问,我们希望为您提供一个快捷方式来调整您的 Photon Voice 应用程序。

5.游戏内设定

Photon Voice 应用程序最重要的运行时设置被分组在一个 ToggleGroup 中:

  1. Transmit:禁用时语音传输将被关闭。否则,声音将在本地录制并传输。
  2. Mute Speaker:此设置如其所说,通过将音量设置为零来使扬声器静音。
  3. VoiceDetection:此设置启用或禁用语音检测功能。
  4. DebugEcho:此设置在使用单个客户端测试语音应用程序时很有用。如果打开,发送的音频流将从服务器发送回原始发送者。仅用于调试目的。

 6.全局设置

  1. AutoConnectAndJoin:当 PUN 客户端加入“PUN 房间”时,自动将 Photon Voice 客户端加入“语音室”。
  2. AutoLeaveAndDisconnect:当 PUN 客户端断开连接时自动断开 Photon Voice 客户端。
  3. DebugVoice:切换调试模式。调试文本将出现在屏幕的左上角,其中包含:PUN 和语音应用程序客户端状态、使用的麦克风设备和一些语音统计信息。如果打开,它还会在每个“说话”角色之上显示语音扬声器滞后。

7.突出显示语音组件

为了说明两个主要语音组件的工作原理,我们使用了显示在每个Player顶部的等距视图。此视图基于“世界空间”模式下 Unity 的新 UI 系统。它包含 2 个图标:

 此图标的目的是显示播放玩家语音的时间。它绑定到 PhotonVoiceView 组件。根据此代码显示或隐藏图像:

speakerSprite.enabled = photonVoiceView.IsSpeaking;

此外,当切换 DebugVoice 全局设置时,文本将开始显示在同一视图中,其中包含不断更新的数字。它应该告知扬声器组件中的滞后。启用或禁用如下:

bufferLagText.enabled = showSpeakerLag && photonVoiceView.IsSpeaking;
if (bufferLagText.enabled)
{
    bufferLagText.text = string.Format("{0}", photonVoiceView.SpeakerInUse.Lag);
}

 

 这个图标的目的是显示玩家的声音何时被录制和传输。它绑定到 PhotonVoiceView 组件。根据此代码显示或隐藏图像:

recorderSprite.enabled = photonVoiceView.IsRecording;

 您可以查看同名的“Highlighter.cs”文件和类以了解更多信息。

8.不同的相机

由于 Photon Voice 可用于任何类型的游戏,包括 AR 和 VR,因此有一个工作示例会有助于展示 3D 声音体验有多好。为此,我们准备了 3 种相机模式:
“第一个人”:

"Third Person":

"Orthographic" (Default):

加入房间后,您可以随时在它们之间自由无缝地切换。一旦玩家的角色被实例化,屏幕右上角就会出现三个相应的按钮。 

9.手机摇杆 

该演示包括对移动触摸输入的支持。在智能手机或平板电脑上,您可以使用基于 Unity 标准资产的演示附带的操纵杆 UI。要使用此功能,您需要从 Unity 的菜单中启用“移动输入”,并在 Unity 的构建设置中切换到兼容平台。

10.调试模式

当 DebugVoice 开关打开时,调试模式被启用。在此模式下,屏幕左上角会显示额外信息,其中包括:

  1. PUN 客户端状态
  2. 语音客户端状态
  3. 平均和峰值语音幅度
  4. 可用的麦克风设备列表或如果没有则发出警告。通常,大多数设备都包含一个麦克风。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双目、结构光、tof,三种深度相机的原理区别看这一篇就够了!

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…

win10屏幕录像哪个好用?这2款录屏软件值得推荐!

案例:win10电脑如何录屏? 【我使用的电脑是win10系统,我想对它进行屏幕录制。有没有小伙伴知道win10电脑如何录屏?win10录屏软件哪款比较好用?】 在如今互联网时代,屏幕录像是一项非常实用的功能&#xf…

【大数据之Hadoop】三十二、MapReduce生产经验

1 MapReduce跑的慢的原因 MapReduce程序效率的瓶颈在于两点: 1)计算机性能:CPU、内存、磁盘、网络 2)I/O操作优化 (1)数据倾斜 (2)Map运行时间太长,导致Reduce等待过久 …

高斯-约旦消元法

1,思想 该算法基于高斯消元,但是思想是把矩阵化为对角阵,从而避免回代的操作思路是一列一列处理,每次选为处理过的行中主元最大(极大避免精度损失)的行处理。把这一列除了主元这一行的元素,其余该列的其他…

c#笔记-委托

委托 委托是方法的类型。 有了类型就可以声明方法的变量,参数,字段。然后再调用他。 很多新人很困惑,为什么要把方法做成变量,不直接去调用它呢? 这是因为在目前你的认知里,代码都是你一个人写出来的。 如…

计算机图形学-GAMES101-5

一、观测变换 通过Viewing(观测)transformation,最终我们将世界坐标系中的物体投影到了一个xyz都处于【-1,1】的立方体中。那么接下来,我们该做什么? 二、光栅化(Rasterization) (1)透视投影的定义 定义透视投影的视…

〖大学生·技术人必学的职业规划白宝书 - 职业规划篇①〗- 大学生选择职业前的自我认知与剖析

历时18个月,采访 850 得到的需求。 不管你是在校大学生、研究生、还是在职的小伙伴,该专栏有你想要的职业规划、简历、面试的答案。说明:该文属于 大学生技术人职业规划白宝书 专栏,购买任意白宝书体系化专栏可加入TFS-CLUB 私域社…

linux之线程同步

1. 互斥锁 定义锁: pthread_mutex_t 初始化锁函数: int pthread_mutex_init(pthread_mutex_t* mutex,pthread_mutexattr_t* attr); 第一个参数是定义的互斥锁的地址,第二个参数是锁的属性,一般传NULL 互斥锁的属性在创建…

(C语言版)力扣(LeetCode)+牛客网(nowcoder)二叉树基础oj练习

二叉树基础oj练习 965. 单值二叉树题目解法 100. 相同的树题目解法 101. 对称二叉树题目解法 144. 二叉树的前序遍历题目解法 94. 二叉树的中序遍历题目解法 145. 二叉树的后序遍历题目解法 572. 另一棵树的子树题目解法 KY11 二叉树遍历题目解法 结语 965. 单值二叉树 题目 …

Linux安装MongoDB数据库并内网穿透在外远程访问

文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 转发自CSDN cpolarlisa的文章:Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接「内网穿透…

LeetCode572. 另一棵树的子树LeetCode

572. 另一棵树的子树 描述示例解题思路以及代码 描述 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节…

数据库|SQL调优案例之TiFlash帮倒忙该怎么办?

一、背景 早上收到某系统的告警tidb节点挂掉无法访问,情况十万火急。登录中控机查了一下display信息,4个TiDB、Prometheus、Grafana全挂了,某台机器hang死无法连接,经过快速重启后集群恢复,经排查后是昨天上线的某个S…

Flink消费pubsub问题

我看网上flink消费pubsub的资料并不多,最近跑通了,大家有问题的可以给我留言。 一、基本资料 1.flink官网接入方式 Google Cloud PubSub | Apache Flink StreamExecutionEnvironment streamExecEnv StreamExecutionEnvironment.getExecutionEnviron…

Android平台如何实现外部编码后(H.264/H.265)数据实时预览播放

技术背景 我们在对接开发者的时候,遇到这样的诉求:除了正常的RTMP、RTSP直播播放外,有些硬件设备输出编码后(H.264/H.265)的数据,比如无人机或类似硬件产品,回调出来的H.264/H.265数据&#xf…

C#中的委托是什么

https://www.cnblogs.com/deepalley/p/12150931.html 1.什么是委托?(方法作另一个方法的参数) delegate void MyDel(int value); //声明委托类型 和类一样,委托是用户自定义的类型,但是类是数据和方法的集合&#…

vue实现功能完整的购物商城,商品零食、电商通用商城

目录 一、项目结构 1.项目截图 2.项目简介 3.项目布局 二、首页 1.效果图 2.源码 三、商品详情 1.效果图 2.源码 四、分类 1.效果图 五、购物车、提交订单 1.效果图 六、个人中心 1.源码结构 2、效果图 七、总结 一、项目结构 1.项目截图 2.项目简介 项目基于vue…

海睿思分享 | 一文读懂企业数据资产目录建设的重要性

小王是某公司信息化部门负责人。 某天,公司领导需要获取近三年来生产部门的人员信息全面数据,小王费了九牛二虎之力,召开了各种会议,在各个系统里来回找数据,最终找到了这些数据。然而领导所需的人员职称、人员获奖信…

UOS服务器系统配置bond

一、Bond介绍 bond可以将多个网卡绑定到一起,可以让两个或多个接口作为一个接口,同时提高带宽,并提供网络链路的冗余,当有其中一块网卡故障的时候,不会中断服务器的业务。 二、Bond模式 1、mode0(balanc…

老杨说运维 | 运维数智化转型正确打开方式是什么?他这样说

2023年5月9日,中国计算机用户协会信息科技审计分会会员大会暨金融科技风险管理与审计论坛成功于北京召开。擎创科技CEO杨辰受邀与会,并分享了在数智运维发展过程中对企业数智化转型建设的规划思考以及相关实践经验。 同时,年会上举行了“金融…

《基础知识》提示学习的基本知识

《基础知识》提示学习的基本知识 提示学习背景提示的形式和元素提示学习的输入形式提示学习的重要元素提示学习的输入形式举例基本提示任务提示学习 内容参考:打工人转型之道(二):提示工程(Prompt Engineering)进阶篇