入门
Photon Voice 2是Photon Voice的后续版本,它带来了以下功能:
- 改进了API和更好的Unity组件。
- 与PUN2兼容。
- 灵活性:由于现在它与PUN2分离,它可以与Photon Realtime、Photon Bolt、Photon Chat同时甚至单独使用(Unity引擎中)。
- 新的基于WebRTC的DSP(数字信号处理器)。
- 更新了新的演示。
Photon Voice 2可以从Unity Asset Store下载和导入。最低Unity版本要求为2017.4.7f1。
支持的平台
- Windows
- UWP
- macOS
- Android(64位支持)
- iOS
- PlayStation 4(需要一个特殊的附加组件)
- Nintendo Switch(需要一个特殊的插件)
- MagicLeap (Lumin OS,需要一个特殊的附加组件)
- Xbox One(需要一个特殊的加载项)
[组件] VoiceConnection 语音链接
场景中需要一个VoiceConnection组件实例才能将语音客户端连接到Photon服务器。由于语音传输只能在房间内进行,因此VoiceConnection用于进行配对,并确保客户已加入了房间。
[组件] Recorder 录音机
由于录音机是一个非常重要的组件,它在这里有自己的专用页面。
[组件] Speaker 扬声器
Speaker 组件负责播放传入的音频流。它利用了Unity的AudioSource组件。在音频流的上下文之外或者在通过其创建事件获取传入流的信息之前,组件本身没有多大意义。该事件及其包含的数据对于将本地Speaker组件“链接”到远程音频流非常重要。下面,将解释如何使用扬声器。
SpeakerFactory 扬声器工厂
每次收到新的远程音频流信息时,都会调用SpeakerFactory方法。SpeakerFactory用于将本地Speaker组件绑定到通过远程Recorder组件传输的输入音频流,这样音频流的两端发送器和接收器将连接在一起。我们支持远程Recorder和本地Speaker之间的一对一关系。默认情况下,不能使用单个Speaker组件实例混合和播放多个输入音频流。一个Speaker 一次链接到一个Recorder,它不能多次链接到同一个音频流。另外,默认情况下,不能使用多个Speaker组件实例播放单个传入音频流。
在工厂中,您需要返回一个Speaker组件,该组件将用于播放从该远程音频流接收到的音频帧。您可以创建一个新的Speaker组件,或者重新使用旧的Speaker组件,或者返回null来忽略播放来自同一远程音频流的所有未来传入音频帧。
传递给SpeakerFactory方法的参数帮助您识别音频流的源或源。SpeakerFactory主体中的代码应用于查找最合适的候选Speaker组件(如果存在,或者在需要时创建一个新的)来播放将从来自远程Recorder组件的输入音频流接收到的音频帧。
SpeakerFactory方法接受3个参数并返回一个播放输入音频的Speaker组件(使用附加在相同GameObject对象上的AudioSource组件)。SpeakerFactory方法接受的3个参数是:
- playerId:音频流来源的玩家的角色编号。
- voiceId:来自同一playerId的音频流的编号。
- userData:在传输音频流的Recorder组件中设置的自定义对象。
Default SpeakerFactory 默认扬声器工厂
如果未显式设置SpeakerFactory,则默认设置为VoiceConnection.SimpleSpeakerFactory将被使用。默认VoiceConnection.SimpleSpeakerFactory保证每个远程音频流都有一个本地实例化的Speaker。如果使用SpeakerPrefab,那么该预设将被实例化为层次结构中默认位置的根对象,并具有默认旋转。否则将创建一个新的GameObject。Speaker组件附加到的GameObject将被重命名为“Speaker for Player {0} Voice #{1}”并在远程音频流被删除时被销毁。
Interest Groups Usage Demystified 兴趣组使用揭秘
Photon Voice 使用 Photon Realtime的“Interest Groups”来分离属于不同“语音对话”的互斥“语音频道”。
Select "Who To Listen To" 选择“听谁说”
每个参与者都需要订阅感兴趣的兴趣组。默认情况下,所有参与者都收听兴趣组0,该组可以被视为语音广播的全局兴趣组。如果你想收听发送到其他群组的声音,你需要订阅这些群组。您也可以取消订阅以前订阅的。完成这一切的操作是:
// without PUN integration:
voiceConnection.Client.OpChangeGroups(groupsToRemove, groupsToAdd);
// with PUN integration:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(groupsToRemove, groupsToAdd);
Select "Who To Talk To" 选择“与谁交谈”
玩家要决定每个组需要传输的音频。可以使用以下方法设置目标兴趣组:
recorder.InterestGroup = targetGroup;
Use Cases 用例
在所有情况下,您始终收听默认兴趣组0,并且可以在同一时间将语音传输到每个Recorder组件的单个兴趣组。用例可以分为三个不同的类别:
1.Single Global Group 单一全局组
如果您使用单一组,在一个时间,以传送声音到所有客户端和所有Recorder组件,有一个快捷方式来设置或切换这个全局组:
// without PUN integration:
voiceConnection.Client.GlobalInterestGroup = targetGroup;
// with PUN integration:
PhotonVoiceNetwork.Instance.Client.GlobalInterestGroup = targetGroup;
在这种情况下,不需要调用OpChangeGroups或设置Recorder.InterestGroup,因为它在内部为你做了。
注:
- 如果targetGroup等于0,则具有默认行为。不需要显式地将其设置为全局组,除非您更改了某些内容并希望重置设置。
- 如果targetGroup不等于0,那么您仍然可以接收传输到同一组的语音流。
- 在这种情况下,传输的所有记录器组件将使用相同的全局设置目标组。
2.Listen To A Single Group 听单一组
这与上一个类别不同,因为它允许以下内容:
- 为每个Recorder设置不同的目标组。
- 要听的组可以不同于要交谈的组。
A. Default Group
// A. unsubscribe from all groups, this is optional if groups were not changed before
// without PUN integration:
voiceConnection.Client.OpChangeGroups(new byte[0], null);
// with PUN integration:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(new byte[0], null);
// B. set target interest group
photonVoiceRecorder.InterestGroup = targetGroup;
B. Other Group
// A. subscribe to the group to listen to
// without PUN integration:
voiceConnection.Client.OpChangeGroups(new byte[0], new byte[1] { groupToListenTo });
// with PUN integration:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(new byte[0], new byte[1] { groupToListenTo });
// B. set target interest group
photonVoiceRecorder.InterestGroup = targetGroup;
3. Listen To Multiple Groups 听多个组
A. Listen To All Pre-Existing Groups
// A. subscribe to all pre-existing groups
// without PUN integration:
voiceConnection.Client.OpChangeGroups(null, new byte[0]);
// with PUN integration:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(null, new byte[0]);
// B. set target interest group
photonVoiceRecorder.InterestGroup = targetGroup;
稍后,您可能需要订阅在此调用之后创建的组。
B. Listen To A List Of Groups
// A. subscribe to a custom list of groups
// without PUN integration:
voiceConnection.Client.OpChangeGroups(new byte[0], groupsToListenTo);
// with PUN integration:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(new byte[0], groupsToListenTo);
// B. set target interest group
photonVoiceRecorder.InterestGroup = targetGroup;
你可以和不是你听的人进行讲话。也就是groupsToListenTo不能包含targetGroup。
C. Listen To All Possible Groups
这应该小心使用,因为它可能会将客户端订阅到永远不会使用的组。
using System;
using System.Linq;
// [...]
byte[] allByteValues = Enumerable.Range(1, 255).SelectMany(BitConverter.GetBytes).ToArray();
// A. subscribe to all possible groups
// without PUN integration:
voiceConnection.Client.OpChangeGroups(null, allByteValues);
// with PUN integration:
PhotonVoiceNetwork.Instance.Client.OpChangeGroups(null, allByteValues);
// B. set target interest group
photonVoiceRecorder.InterestGroup = targetGroup;
How To Use Photon Voice Without PUN 没有PUN时如何使用Photon Voice
捷径
- 在场景中添加一个VoiceConnection组件并启用“Don't Destroy On Load”。
- AppSettings 设置为 VoiceConnection.Settings 。
- 将Recorder添加到场景,更新其属性并将其指定为VoiceConnection.PrimaryRecorder。
- 添加一个Speaker预设(一个有Speaker组件的预设)并指定为VoiceConnection.SpeakerPrefab。
- 加入一个房间。为此,请使用Photon Realtime的任何匹配操作(例如,请参见“ConnectAndJoin.cs“程序脚本)。
Advanced Options 高级选项
- 向场景添加VoiceConnection组件。
- AppSettings设置为VoiceConnection.Settings。
- 将Recorder添加到场景,更新其属性并将其指定给VoiceConnection.PrimaryRecorder。
a.可选启用Recorder.TransmitEnabled一旦准备好就开始传输。
b.可选启用Recorder.DebugEchoMode听到自己的声音(需要连接本地Speaker ,请参见步骤4)。 - 决定如何将Speaker组件与远程音频流链接:
a.可选地实现SpeakerFactory方法并将其通过代码分配给VoiceConnection.SpeakerFactory。
b.如果使用默认扬声器工厂,可以选择添加一个扬声器预设(一个具有扬声器组件的预设)并将其分配VoiceConnection.SpeakerPrefab。 - 加入一个房间。为此,请使用Photon Realtime的任何匹配操作(ConnectAndJoin请参见“ConnectAndJoin.cs“例如,程序脚本)。
- [如果在3.a.中未启用]一旦进入房间开始传输,通过设置Recorder.TransmitEnabled 为 true。
- [如果在3.b.中未启用]可选启用Recorder.DebugEchoMode听你自己的声音。
How To Remove PUN 如何移除PUN
如果你想使用没有双关语的光子语音,你可以在你的项目中保留双关语,或者干脆删除它。编辑器有一个快捷方式: "Window" -> "Photon Voice" -> "Remove PUN"。
或者,您可以通过以下步骤手动执行此操作:
- 删除“Demos\DemoVoicePUN”文件夹
- 删除“Photon\PhotonVoice\Code\PUN”文件夹
- 删除“Photon\PhotonUnityNetworking”文件夹
- 同时以下也会为你执行,但是还需确保在"Project Settings" -> "Player" -> "Other Settings" -> "Scripting Define Symbols",PHOTON_UNITY_NETWORKING, all PUN_2_X_OR_NEWER and PUN_2_OR_NEWER 都被删除了。
您可以随时通过“Asset Store”重新导入“Photon Voice 2”资源包,将这些文件复原回来。
How To Remove Photon Chat 如何移除Photon Chat
如果要使用Photon Voice而不使用Photon Chat,可以将Photon Chat保留在项目内部,也可以将其删除。编辑器有一个快捷方式:"Window" -> "Photon Voice" -> "Remove Photon Chat"。或者,也可以通过删除“Photon\PhotonChat”文件夹手动执行此操作。
当然,可以随时通过“Asset Store”重新导入“Photon Voice 2”资源包,将这些文件复原回来。
【完】