专栏首页游戏多媒体引擎GME开发前沿GME+MGOBE|联机游戏与实时语音的碰撞

GME+MGOBE|联机游戏与实时语音的碰撞

从2010年至2013年开始,在Android系统以及iOS系统的加持下,手游产业开始迎来了爆发期,各式各样的手游开始出现。2015年后,随着移动游戏的爆发增长,手机联机对战游戏也开始异军突起,此后手机电竞开始越来越白热化,语音也跟移动游戏的结合更紧密,满足游戏的多种交流需求

1/4 为何使用GME游戏语音?

使用GME游戏语音,有以下三个理由:

流畅

游戏语音1.0时代,行业大佬李学凌就喊出了“不卡不掉不延迟”这一语音体验经典总结。游戏语音2.0时代,语音是以插件形式内嵌至移动游戏中,就会涉及至API交互,游戏开发者比较关注GameClient与语音的交互是否顺畅,因此“不卡”除了语音本身不卡(网络抗性决定),还包括了语音与游戏的交互不卡。GME实时语音结合应用场景的深度优化,普通音质语音时延低至200ms,50%以上丢包、1000ms网络抖动下仍能顺畅沟通。

清晰

体验是挂在产品经理嘴边的口头禅,语音清晰性又是游戏语音体验最重要的指标,语音场景体验包括两个方向,一是声音的清晰,二是声音的流畅。手游场景,玩家随时随地可能拉起开黑,戴耳机的比例较低(约15%),而手游场景语音的同时大家又还要听游戏背景音效(脚步声可以说是“活命线索”),而手机扬声器离麦克风距离是厘米级,背景音对人声干扰很大,很容易产生噪声,背景音透传,是影响语音清晰度的最大的因素。不流畅主要是网络丢包,抖动导致。GME 高清音质利用回声消除、环境音消除、噪声抑制、啸叫抑制专利算法还原清晰听感。

游戏开发适配

现在的手机游戏,国内开发团队用的很多都是Unity引擎,但越来越多的对画质更加追求的工作室开始使用更加复杂的游戏引擎,例如Unreal。甚至现在的游戏厂商会多平台发布游戏,比如堡垒之夜,移动端和主机端均发布了游戏。 我们GME提供主机端 SDK,支持 PS4、Xbox、Switch 游戏集成,与 Wwise 音频引擎深度融合,独创性地解决了开语音时游戏背景音效丢失的问题。针对主流游戏引擎 Unity、Cocos、UE 深度优化,跨平台支持 MacOS、Windows、iOS、Android 系统。依托 QQ 亿级用户,适配全部 iOS 设备和 2000+ Android 终端设备,保证用户体验一致,节省开发时间。

2/4 接入GME语音

在此演示中,我们将结合MGOBE演示Demo实现一个可以运行的游戏中接入游戏语音GME。

本文使用的环境:

GME SDK 版本为 2.7.0;【点击到达2.7.0发布公告】

MGOBE SDK版本为 v1.2.8;

Unity 版本为 2019.4.7f1。

另外我们在 Unity 的官方网站上下载到MGOBE的DEMO,我们会将 GME 游戏语音集成在这个 DEMO 里面。

1、下载SDK

在游戏多媒体引擎官网【跳转后点击原文链接】可以下载到最新版的 SDK, 目前我们只需要下载 Unity 版本的 SDK 即可。

2、导入SDK

将下载好的 SDK 文件解压后,拷贝到 Unity 工程中,删除 Plugin 中的平台文件夹,只保留 Android、gmesdk.bundle 以及 x86_64。详细参考游戏多媒体引擎Unity工程配置。

3、接入SDK

3.1 初始化SDK

就像其他联机对战游戏一样,一开始会有一个登录界面,这里会分配给每一个用户一个独立的标识码。我们在界面上随机一个大于 10000 小于 20000 的数字。因为如果要初始化 GME SDK,需要这个数字(数值大于 10000 的 int64 位数字转 string)作为参数 OpenId 传入接口 Init,接口的调用及参数类型请参考Unity接入文档-Init接口。

当点击登录之后,我们在按钮的响应事件中进行初始化的操作,即在【登录】按钮事件中调用以下代码:

//获取面板上的数字作为参数
GME_OpenId = loginPanel.myOpenId.text;
Debug.Log("GME_OpenId" + GME_OpenId);
int ret = ITMGContext.GetInstance().Init("1400089356", GME_OpenId);
//通过返回值判断是否初始化成功
if (ret != QAVError.OK)
{
    Debug.Log("SDK初始化失败:" + ret);
    return;
}

接下来在 Unity Update 方法中我们添加 GME 的 Poll 接口。

3.2 进入房间

点击【登录】按钮之后,会出现一个游戏大厅的界面。

在这个界面上有两个按钮,一个是【自动匹配】,另一个是【创建房间】,如果已经有房间的话,界面上还会显示房间列表。

我们的逻辑是,在进入联机对战房间的时候,同时也进入语音房间。先在 Init SDK 成功后,监听进入语音房间事件的回调以及退出语音房间事件的回调。

ITMGContext.GetInstance().OnEnterRoomCompleteEvent += new QAVEnterRoomComplete(OnEnterRoomComplete);
ITMGContext.GetInstance().OnExitRoomCompleteEvent += new QAVExitRoomComplete(OnExitRoomComplete);

然后我们继续写一个 GME 实时语音进房方法EnterRoom:

public void EnterVoiceRoom() {
    byte[] byteAuthbuffer;
    GME_RoomId = Global.Room.RoomInfo.Id;
    if (GME_OpenId != null)
    {
        byteAuthbuffer = GetAuthBuffer("1400089356", GME_RoomId, GME_OpenId, "请从GME控制台获取");
        ITMGContext.GetInstance().EnterRoom(GME_RoomId, ITMGRoomType.ITMG_ROOM_TYPE_FLUENCY, byteAuthbuffer);
    }
}

其中进房的时候需要房间号。使用联机对战引擎需要实例化 Room 对象,Room 对象会自动维护内部的 roomInfo 属性保持最新,我们可以直接通过访问该属性获得最新的房间信息。即通过 Global.Room.RoomInfo.Id 获取房间 Id,这个 Id 作为进语音房间的房间号。

房间类型由于我们现在是联机游戏,所以选择适用于游戏的流畅音质。

最后我们再写 GME 进房回调事件的处理。

void OnEnterRoomComplete(int err, string errInfo)
{
    if (err != 0)
    {
        Debug.Log("错误码:" + err + " 错误信息:" + errInfo);
        return;
    }
    else
    {
        //进房成功
        Debug.Log("进房成功");
        isMicOpen = false;
        isSpeakerOpen = false;
    }
}

3.2.1 创建对战房间

我们先从创建房间说起,创建房间会有一个创建房间的界面。

找到【创建房间】按钮,可以找到绑定的事件为 Client.CreateRoom,里面可以看到创建联机的相关代码,如果联机对战的 CreateTeamRoom 接口返回成功,即成功创建了联机房间,我们便同时进入语音房间:

Global.Room.CreateTeamRoom

Global.Room.CreateTeamRoom (para, eve => {
    if (eve.Code == 0) {
        RefreshRoomList ();
		//如果联机对战的 CreateTeamRoom 接口返回成功,即成功创建了联机房间,我们便同时进入语音房间。
        AddAction (() => { onRoomInPanel ();
						EnterVoiceRoom(); });
    } else {
        Debug.Log ("create Team Room Fail: {0}" + eve.Code);
        AddAction (() => { HideRoomPanel (); });
    }
});

3.2.2 自动匹配

联机对战更多的是使用自动匹配去让玩家进行组队联机对战,联机对战的匹配接口为 matchPlayers,匹配结果将在 callback 中异步返回。操作成功后,Room 对象内部 roomInfo 属性将更新。如果匹配成功,那么我们就根据匹配的房间名字进入相应的语音房间。房间匹配的代码如下,我们在匹配成功之后调用进入 GME 语音房间的方法:

public void MatchRoom () {
    CreateWaitForMatchRoomPanel ();
    MatchRoomPara para = new MatchRoomPara {
        RoomType = "Battle",
        MaxPlayers = 2,
        PlayerInfo = this.playerInfoPara
    };
    // 进行房间匹配
    Global.Room.MatchRoom (para, eve => {
        if (eve.Code != 0) {
            RefreshRoomList ();
            AddAction (() => { onRoomInPanel (); });
        } else {
            RefreshRoomList ();
			//我们在匹配成功之后调用进入 GME 语音房间的方法
            AddAction (() => { onRoomInPanel ();
                EnterVoiceRoom();
            });
        }
    });
}

【注意】不能在异步回调中调用 GME 相关接口,必须保证所有接口都在主线程调用。

3.2.3 加入房间

如果第一个用户以及创建了房间,那么第二个用户没进房的时候,可以在面板看到第一个用户创建的房间。

4、打开麦克风扬声器

需要在进房成功之后才能打开麦克风及扬声器。所以我们在进入匹配房间后的界面新增设备操作按钮。

加入房间之后的界面如下,我们添加两个按钮,一个用来开启麦克风,一个用来开启扬声器:

接下来我们为麦克风按钮写相应事件,通过一个 bool 变量来表示是否开关麦克风,当进入房间的时候我们把这个变量设为 false,因为进入语音房间默认不打开麦克风及扬声器。

public void OnMicButton() {
    ITMGContext.GetInstance().GetAudioCtrl().EnableMic(!isMicOpen);
    if (!isMicOpen)
    {
        GME_MicButton.GetComponentInChildren<Text>().text = "麦克风开";
    }
    else {
        GME_MicButton.GetComponentInChildren<Text>().text = "麦克风关";
    }
    isMicOpen = !isMicOpen;
}

5、退出房间

当点击界面上的后退按钮的时候,会退出对战房间,此时我们也相应的退出语音房间。

退出语音房间需要调用 ExitRoom 接口,同时需要监听退房回调。

public void LeaveRoom () {
    // 离开房间
    Global.Room.LeaveRoom (eve => {
        RefreshRoomList ();
        isReadyToBattle = false;
    });
    ITMGContext.GetInstance().ExitRoom();
}

退出房间完成后,我们把 UI 进行更新,回到游戏大厅界面。

void OnExitRoomComplete() {
    roomInPanel.gameObject.SetActive(false);
    canRefreshPlayer = false;
    canRefreshRoom = true;
    roomsPanel.gameObject.SetActive(true);
    waitForMatchRoomPanel.isActive = true;
    roomInPanel.setReadyBtn.interactable = true;
    roomInPanel.setReadyBtn.gameObject.SetActive(true);
    roomInPanel.cancelReadyBtn.gameObject.SetActive(false);

    isMicOpen = false;
    isSpeakerOpen = false;
}

6、反初始化

确定退出的时候,需要反初始化 SDK。

private void OnDestroy () {
    Global.UnInit ();
    ITMGContext.GetInstance().OnEnterRoomCompleteEvent -= new QAVEnterRoomComplete(OnEnterRoomComplete);
    ITMGContext.GetInstance().OnExitRoomCompleteEvent -= new QAVExitRoomComplete(OnExitRoomComplete);
    ITMGContext.GetInstance().Uninit();
}

3/4 整体流程

回顾一下上文的整体流程,大致如下:

4/4 导出测试

选择 File-Build Setting,选择【Build】按钮,导出 windows 系统可执行文件。

导出之后双击【NetSdkDev.exe】可执行文件便可进入游戏进行测试。

本文分享自微信公众号 - 腾讯游戏多媒体引擎(gh_bcad1d7b1c21),作者:给大家送福利的

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 别在纠结“后端”开发了,联机小游戏还可以这样做!

    本篇文章要感谢「银笑的尤里」从 9月28日腾讯云深圳「游戏开发的超“音”“速”」沙龙发来了重磅消息,下面 Shawn 重点介绍对个人开发者惊喜的“MGOBE” ...

    张晓衡
  • Cocos Creator v2.3.4 正式接入腾讯云服务,可直接调用MGOBE & GME

    今日腾讯云的游戏相关服务已正式接入 Cocos Creator,各位开发者可以通过 Cocos Service 服务面板 ,一键开通腾讯云服务。

    腾讯游戏云
  • 阅兵式太震撼了,深圳腾讯云沙龙又为个人开发者带来怎样的惊喜?

    在使用API之前还需要到腾讯云上开通 MGOBE 的使用权限,拿到 gameId、secretKey、url 等信息,然后就可能使用代码初始化联机对战引擎,代码...

    张晓衡
  • Cocos Creator v2.3.4 正式接入腾讯云服务

    在激烈的市场环境下,很多游戏都有对云服务的需求。2019 年底,Cocos 与腾讯云正式宣布达成战略合作,双方聚势共赢,共同探索提升游戏开发工作流的效率,把游戏...

    陈皮皮
  • 腾讯多媒体实验室受邀参加Audiokinetic Wwise全球巡演会,展示游戏语音和音频解决方案

    近日,腾讯多媒体实验室受邀参加Audiokinetic Wwise全球巡演会。巡演会上,腾讯多媒体实验室团队展示了游戏多媒体引擎(GME)联合解决方案。该解决...

    腾讯多媒体实验室
  • 分享实录 | 技术更迭视角下的游戏语音新玩法

    5月26日,2021 IGS·全球数字文创发展大会“腾讯云·游戏&新文娱分论坛”在成都成功落幕。在本次论坛中,腾讯云游戏多媒体引擎(GME)高级产品经理郑丁益进...

    游戏多媒体引擎GME
  • 来了!GME沉浸式语音方案助力游戏实现Metaverse的无尽想象

    最近爆火的“元宇宙”概念,从“Meta+Verse”的词义直译而来,最早来源于美国科幻小说《雪崩》,指的是一个平行于现实的网络世界。游戏是最接近“Metaver...

    游戏多媒体引擎GME
  • 【预约中】腾讯云GME技术方案介绍

    游戏多媒体引擎(Game Multimedia Engine,GME)提供一站式语音解决方案。针对不同场景进行深度优化,覆盖游戏、社交、娱乐等多种泛互联网行业应...

    可可爱爱没有脑袋
  • 使用Wwise-GME独家方案实现丰富的游戏语音效果

    作为最专业的游戏音频引擎,Audiokinetic公司的Wwise引擎是游戏开发者进行游戏音频设计时的首选方案。游戏多媒体引擎(GME)与Wwise引擎联合开发...

    游戏多媒体引擎GME
  • 【预约中】GME语音服务基于Wwise引擎的解决方案

    经常用电脑/手机玩游戏的朋友,应该不会对语音与音频冲突的问题感到陌生——使用语音交流时,就很难听清游戏中的枪声/脚步声,从而影响反应速度。为了解决这一问题,各大...

    可可爱爱没有脑袋
  • 一个小视频带你了解WWise+GME的神奇语音效果

    下面的一个小视频可以让你直观了解 Wwise+GME 可以做到什么样的语音效果,但首先,我们先来了解一下“Wwise+GME”:

    shusen
  • 仅有两名前端开发,联机小游戏一周内上线,如何做到?

    它在上线四小时内用户数激增60倍,获得新华社力荐,开发过程中仅投入2个前端开发+1个美术+1个策划,这款小游戏里,单机玩法、邀请好友对战、在线匹配对战、排行榜、...

    泛互联网行业产品团队
  • 腾讯云游戏多媒体解决方案

    说到音频,就不得不说腾讯音视频实验室了,腾讯音视频实验室,成立于2010年,八年间专注于音视频通信技术的前瞻性研究,包括全球实时音视频网络优化、音视频编解码前沿...

    Techeek
  • 腾讯云游戏行业整体解决方案

    随着游戏行业的迅猛发展,游戏行业竞争日益加剧,好的用户体验度和快速反应能力成为游戏网站发展的关键。游戏行业整体解决方案将能够为游戏厂商提供优质全面便捷的服务。

    可可爱爱没有脑袋
  • 解析腾讯云游戏多媒体引擎GME技术方案

    在网络游戏中,无论是大逃杀、棋牌类、电子竞技类还是娱乐休闲类小游戏,玩家和玩家之间的互动和语音聊天都是一个必不可少的环节。作为一个通用的技术需求,如果由游戏厂商...

    可可爱爱没有脑袋
  • 内行看门道:看似“佛系”的《QQ炫舞手游》,背后的音频技术一点都不简单

    3月14日,腾讯旗下知名手游《QQ炫舞》正式上线各大应用商店,并迅速登上App Store免费游戏总榜第一位。作为一代玩家的青春记忆,早在游戏发布前,《QQ炫舞...

    腾讯游戏云
  • 团战开黑必备“良药”了解一下!

    第十八届亚运会在印度尼西亚首都雅加达进行得如火如荼,电子竞技作为2018亚运会的表演赛项目,首次登上亚运会的舞台。对于团队合作的电竞赛事来说,队友间的“语音”交...

    腾讯游戏云
  • 仅有两名前端开发,联机小游戏一周内上线,如何做到?

    它在上线四小时内用户数激增60倍,获得新华社力荐,开发过程中仅投入2个前端开发+1个美术+1个策划,这款小游戏里,单机玩法、邀请好友对战、在线匹配对战、排行榜、...

    腾讯云开发TCB
  • 游戏多媒体引擎(GME)技术原理介绍

    游戏语音的处理有特定的门槛,除了采集、处理、编码、传输、解码、渲染等各个环节本身需要的技术能力和经验之外,还需要很强的工程实力,解决几千种机型的适配和音频兼容性...

    泛互联网行业产品团队

扫码关注云+社区

领取腾讯云代金券