最近在做一个实时竞技类游戏,类似于王者荣耀类型的MOBA类实时联网游戏。针对战斗和组队界面需要加入语音的方便大家进行交流,看了几家语音价格也都是参差不齐最后选择的是腾讯的GVoice(价格很低折合费用下来一人一天0.012元),这个也是我们目前用的最合适的。后面我会把完整流程写下来并且把我踩的坑也讲一下,感谢大家的支持。
GVoice官网
先进行账号注册,这里我就不过多提示了,直接进入开启服务的申请和创建项目。
根据下属图进行对应的创建即可
创建之后进入创建项目的控制台如下图
点击进入之后进行申请
申请之后可以找客服对接一下,让他帮你快速通过
GVoice的独立版官方文档,文档中有一些常规的错误和一些解决方案,当然这不是全部的坑都在里面,所有的API和调用方法是可以看的,踩的坑还是五花八门的,后面在继续说坑的问题。
GVoice的集成板官方文档
独立版是需要自己下载SDK拖到Unity项目中,这也是我尝试的方法,推荐这个方法。这里我也是主要讲一下独立版SDK的接入。
集成板则是需要在UnityStore中去关注下载这个sdk,在Unity中用PackageManager进行安装SDK,这里的安装方法我就不仔细说了,在Store中搜索GVoice找到腾讯加的插件下载安装到项目中即可。
SDK分为海外版和国内版,SDK连接下载。
打开网页下载自己对应的版本如下图
下载解压完成之后如下图
将上面两个文件夹放入到Unity中
这里可以参考我上面的官方独立版API,里面写的更全面一些,这里我只接入了小队语音,还有一些高级的玩法我们没有用到就没有接入。
这是我创建的测试工程UI和使用到的一些API如下图
代码如下我就不过多解释了备注都加了差不多应该都能看明白,SDK的appId和appKey在自己创建的项目中的控制台中找一下,然后下面可以参考我写的一些小队语音的常规操作API,如果想要接入其他的API功能可以在官方的API中在查找一下
using gcloud_voice;
using System;
using UnityEngine;
using static gcloud_voice.IGCloudVoice;
public class SDKInit : MonoBehaviour
{
IGCloudVoice sVoiceEngine;
// Start is called before the first frame update
void Start()
{
sVoiceEngine = GCloudVoice.GetEngine();
//接入时请将"AppID"替换为开通业务时从管理控制台获取的 AppID
string appID = "**********";
//接入时请将"AppKey"替换为开通业务时从管理控制台获取的 AppKey
string appkey = "*******************************";
// 接入时替换为玩家唯一标识符
//string openID = "970001";
string openID = DateTime.Now.ToString();
int AppInfoID = sVoiceEngine.SetAppInfo(appID, appkey, openID);
Debug.LogError("AppInfoID = " + AppInfoID);
int InitId = sVoiceEngine.Init();
Debug.LogError("InitId = " + InitId);
sVoiceEngine.OnJoinRoomComplete += JoinRoomCompleteHandler;
}
// Update is called once per frame
void Update()
{
if (sVoiceEngine != null)
{
sVoiceEngine.Poll();
}
if (Input.GetKeyDown(KeyCode.Space))
{
GetRoomNumber();
}
}
public void GetRoomNumber()
{
string roomName = "abc";
int memNum = 8;
RoomMembers[] memberlist = new RoomMembers[memNum];
sVoiceEngine.GetRoomMembers(roomName, memberlist, memNum);
Debug.LogError("memberlist.Length = " + memberlist.Length);
Debug.LogError("memberlist[0].memberid = " + memberlist[0].memberid);
}
public void StartTeamRoom()
{
sVoiceEngine.SetMode(GCloudVoiceMode.RealTime);
string mRoomName = "abc";
int mTimeOut = 10000;
sVoiceEngine.JoinTeamRoom(mRoomName, mTimeOut);
}
void JoinRoomCompleteHandler(GCloudVoiceCompleteCode code, string roomName, int memberID)
{
Debug.LogError("code = " + code);
Debug.LogError("roomName = " + roomName);
Debug.LogError("memberID = " + memberID);
}
///
/// 暂停语音
///
public void VoiceEnginePause()
{
sVoiceEngine.Pause();
}
///
/// 继续语音
///
public void VoiceEngineResume()
{
sVoiceEngine.Resume();
}
///
/// 打开麦克风
///
public void VoiceOpenMic()
{
sVoiceEngine.OpenMic();
}
///
/// 关闭麦克风
///
public void VoiceCloseMic()
{
sVoiceEngine.CloseMic();
}
///
/// 打开扬声器
///
public void VoiceOpenSpeaker()
{
sVoiceEngine.OpenSpeaker();
}
///
/// 关闭扬声器
///
public void VoiceCloseSpeaker()
{
sVoiceEngine.CloseSpeaker();
}
}
注意这个测试只能在Window编辑器下去跑,在Android编辑器模式下是跑不了的,需要修改一下他原来GCloudVoice的代码如下图所示,将原来的宏定义修改如下(不会影响原来打包之后的安卓手机运行)
这里我开始测试的时候是用的编辑器做的测试,这种情况下就需要电脑的麦的权限是开启的,开始我的电脑麦的权限是关闭的情况下运行的发现没有声音以为是插件接入的有问题,在开启语音的过程中在开启麦的权限也是不行的(这里只针对编辑器和电脑端),这里测试的环境必须是先确保麦的权限是开启的在运行Unity去初始化SDK。
这里还有一点是如果你退出的时候没有自己退出房间和关闭麦他是不会自己退出的,等于说你在取消Unity的运行也会有声音,除非你把Unity关闭这样才能退出这个语音房间,不然只能你手动退出。
如果是2020以上的Unity需要将Plugin下的含有.jar的父级文件夹加上后缀.androidlib如下图(加入之后才能识别.jar的文件,打包到手机平台才能没有问题 官方文档标记)
如果没有加后缀上面打包出现的手机端运行报错如下
4111官方文档解释是SDK初始化为成功
上述是我在接入GVoiceSDK时遇到的一些问题和完整流程的整理,有误区的地方希望指正,感谢大家的支持和关注。