0. 背景

语音聊天是游戏中重要的功能,它能便捷用户的聊天,增强用户的粘性。本文会讲述如何在Unity5.x中,使用素材[github地址]中的Unity5.x工程项目如何实现在windows中的简单语音聊天。

1. 聊天服务

本节实现的聊天服务非常简单,有服务端和客户端组成,功能要求如下:

  • 客户端通过设备麦克风输入,服务端立即广播给其他所有客户端;
  • 在网络状况良好的情况下,无论语音输入时间长短,接收端不允许较长的延迟(>2s)
  • 发送端可通过“按住某键录音,松开停止录音”或“按某键一次开始录音,再次按某键停止录音”或“自动检测”发送录音。

2. 使用步骤

a). 下载项目工程。点击run.bat三次,即打开三个voicechat.exe,其中一个作为server,另两个作为client, 如图1。

这里写图片描述
图1. 点击 run.bat

b). server填入PORT,点击start server,如图2,server启动后,则会显示server running,如图3;

这里写图片描述
图2. 填入 PORT

这里写图片描述
图3. server启动后

c). 两个client分别填入server的IP_ADDRESSPORT,点击connect,如图4;此时server的PLAYERS数为2,如图3红框部分;

这里写图片描述
图4. 填入 IP_ADDRESSPORT

d). 两个客户端均选择default microphone(recommanded) 作为麦克风输入,如图5;

这里写图片描述
图5. 选择麦克风输入

e). 在某个发送客户端中按住P键,此时在状态由slient变为transmit,如图6。此时在接收客户端中即可听到语音。

这里写图片描述
图6. 客户端状态由 slient变为 transmit

3. Unity构建

本节简单叙述下如何在Unity中从零还原上述的voicechat.exe

a). 准备材料

1. Unity5.x
2. 四个文件夹,可从github下载到:Base,Behaviour,Networking,UI,其主要功能如下所示:

这里写图片描述

Base:三个dll链接库,其中Ionic.Zlib.dllNSpeex.dll为语音字节流数据压缩以及解压缩库。voicechat.dll为基础库。它包括存储语音信息的数据结构;压缩、解压缩封装;基础类型数据存储池等。

Behaviour:三个csharp文件,均为Unity GameObject的组件。 其中VoiceChatPlayer.cs播放语音信息;VoiceChatRecorder.cs记录语音信息;VoiceChatSettings.cs语音相关设置。

Networking: :三个csharp文件,均为Unity GameObject的组件。VoiceChatExtensions.cs(反)序列化已压缩的语音数据;VoiceChatNetworkProxy.cs客户端代理组件,发送序列化后语音数据至网络,接收网络语音数据;VoiceChatNetworkUtils.cs动态加载客户端代理gameobject。

UI: :五个csharp文件,均为Unity GameObject的组件。其中VoiceChatPickUi.cs为图1;VoiceChatUnityServer.cs为图2;VoiceChatServerUi.cs为图3;VoiceChatUnityClient.cs位图4;VoiceChatUi.cs为图5。

b). 制作客户端代理prefab

a)步骤 中,VoiceChatNetworkUtils.cs动态加载客户端代理gameobject,所以首先制作代理的prefab

1. 新建Unity 2D Project;
2. 打开项目文件夹拷贝materialBase,Behaviour,Networking,UI文件夹至Assets文件夹;
3. 打开项目后,Create Empty,以VoiceChat_NetworkProxy命名;
4. 在VoiceChat_NetworkProxy物体中挂载VoiceChatNetworkProxy.cs组件,VoiceChatPlayer.cs组件和Network View组件
5. 在VoiceChat_NetworkProxy物体中的Network View组件,选择属性StateSynchronizationReliableDeltaCompressed或为1;将组件VoiceChatNetworkProxy拖至NetworkView的属性Observed,如图7.

这里写图片描述
图7. VoiceChat_NetworkProxy物体属性

6. 在Assets新建Resources文件夹,将VoiceChat_NetworkProxy物体拖至Resources中。如图8,并删除在Hierarchy中的物体。

这里写图片描述
图8. Hierarchy中的物体

至此客户端代理prefab制作完毕。

c). 新建Behaviour与UI的gameobject

VoiceChat_Beh物体的Inspector如下图:

这里写图片描述
图9. VoiceChat_Beh物体的 Inspector

VoiceChat_UI物体的Inspector如下图:

这里写图片描述
图10. VoiceChat_UI物体的 Inspector

注意,组件属性均使用默认值;VoiceChat_UI中的VoiceCHatUnityClientVoiceCHatUnityServerdisable的;VoiceChatPlayer.cs是在VoiceChat_NetworkProxy.prefab之中,而不是在VoiceChat_Beh中,因为每个客户端程序中都会有所有的客户端的代理(包括自己的),因而其他的客户端程序传输过来的语音信息都会依靠对应的客户端代理的VoiceChatPlayer.cs进行播放。

最后File/BuildSetting/PlayerSetting中,将Run In Background勾选上,如图11。

这里写图片描述
图11. Run In Background勾选

如果未勾选,那么将server由当前运行移出至背景,则不会相应客户端的请求,因此客户端就不会触发void OnConnectedToServer(),直到将server切换为当前进程。

3. 总结

本文讲述了如何使用既有材料和Unity,构建一个简单的语音聊天客户端,服务端程序。下一节会详细讲述语音聊天的框架流程和相关组件代码。

Logo

致力于链接即构和开发者,提供实时互动和元宇宙领域的前沿洞察、技术分享和丰富的开发者活动,共建实时互动世界。

更多推荐