因为之前对PhotonVoice的文档不太熟悉,踩了不少坑。最严重的坑是把PUN与PhotnVoice分离成了两个服务,导致任意一个服务掉线了处理异常老是得不到同步。后面再一次梳理了下官方的文档与demo后,才大致了解了具体的使用,下面是个人的一些总结。
1.PhotonVoice可以跟PhotonNetwork只创建一个房间使用。
在使用photon时都需要调用CreateRoom方法创建房间,只有用户都在同一个房间里面,多人的数据才能进行交互。同理PhotonVoice也需要创建类似的操作,才能进行多人语音会话。一开始我的误区是这两者都得分别创建一个房间,虽然房间名是一样,但调用的服务不一样。后面发现测试的时候bug越来越多,而且掉线的处理机制分开来处理了,很容易报错。查阅官方的demo后才发现这两者是可以只创建一个房间来共享交互数据的。这样即使掉线了只需要处理一种就可以了。
具体的操作如下:
a.场景中创建一个空物体命名为voice 添加组件PhotonVoiceNetwork和Recorder
PhotonVoiceNetwork组件相当于本地的语音初始化组件,Recorder负责录制麦克风的声音,并同步到多人服务器
b.多人会话需要创建一个通过PhotonNetwork.Instantiate方法来添加player预设,在这个预设的组件上添加PhotonVoiceView,Speaker和Audio Source这三个组件,如图所示
PhotonVoiceView组件是用来同步本地声音到其他客户端的,当它在本体创建时,里面的RecordInUse属性会自动关联上面创建的Recorder组件,另外两个组件是用来激活麦克风的。
c.通过PhotonNetwork.CreateRoom方法创建房间
2.多人语音会听到自己的声音
Recorder组件上取消勾选UseFallback
3.多人语音时会把远程的声音通过麦再一次录进去 形成噪音
Recorder组件的VAD设置阈值。VAD就是Voice Activity Detection 用来检测是否需要录入声音到麦克风的。默认值是0.01,但手机端设置这个值会导致只有一点点声响也会录进麦里,可以根据需求调成0.05以上。
4.本地说话没有声音
a.确认Recorder组件有勾选上Transmit Enable 这个是用于传送声音的 静音的设置也可以通过禁用这个选项来实现
b.确认PhotonVoiceNetwork的Primary Recorder有选上同一物体上的Recorder组件。
c.切换Microphone Type 默认移动端是不能设置这个选项的,编辑器或PC环境下可以设置成Photon或者Unity 两者没多大差异 但photon官方说自己的比较好
d.PC端确认右下角的音频有选中当前的输出设备,VR的话可能会使用了VR设备的音频与麦克风
e.移动端需要确认是否要求了麦克风权限,这个在PlayerSettings里面也可以设置
5.静音操作
可以通过设置
photonVoiceNetwork.RecorderInUse=false
或
photonVoiceNetwork.IsRecording=false
来实现
6.获取所有的用户
因为创建player预设的同时也创建了声音用户,可以通过查找所有的player来实现
总结的大概就是以上内容