Unity5.x实现简易语音聊天(一) 使用步骤
0. 背景语音聊天是游戏中重要的功能,它能便捷用户的聊天,增强用户的粘性。本文会讲述如何在Unity5.x中,使用素材[github地址]中的Unity5.x工程项目如何实现在windows中的简单语音聊天。1. 聊天服务本节实现的聊天服务非常简单,有服务端和客户端组成,功能要求如下:客户端通过设备麦克风输入,服务端立即广播给其他所有客户端;在网络状况良好的情况下,无论语音输入时间长短,接收端不
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_ADDRESS
与PORT
,点击connect
,如图4;此时server的PLAYERS
数为2,如图3红框部分;
图4. 填入
IP_ADDRESS
与
PORT
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.dll
与NSpeex.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. 打开项目文件夹拷贝material
中Base,Behaviour,Networking,UI
文件夹至Assets文件夹;
3. 打开项目后,Create Empty
,以VoiceChat_NetworkProxy
命名;
4. 在VoiceChat_NetworkProxy
物体中挂载VoiceChatNetworkProxy.cs
组件,VoiceChatPlayer.cs
组件和Network View
组件
5. 在VoiceChat_NetworkProxy
物体中的Network View
组件,选择属性StateSynchronization
为ReliableDeltaCompressed
或为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
中的VoiceCHatUnityClient
与VoiceCHatUnityServer
是disable
的;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,构建一个简单的语音聊天客户端,服务端程序。下一节会详细讲述语音聊天的框架流程和相关组件代码。
更多推荐
所有评论(0)