39

在 Unity 多人游戏中实现语音对话

 5 years ago
source link: https://mp.weixin.qq.com/s/n6nJV2GsWer0JjN7EYft8Q?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作者:Hermes Frangroudis,声网 Agora 布道师。

我们曾经不止一次为大家分享过游戏中的实时音视频,例如 怎么实现游戏中的听声辨位狼人杀游戏中的语音聊天 等。基本上,都是从技术原理和 Agora SDK 出发来分享的。这次我们换一个角度。我们将从 Unity 开发者的角度分享一下,在 Unity 中如何给自己的多人在线游戏增加实时语音通话功能。

ra6FZrj.jpg!web

我们在这里利用了 Unity 上流行的 “Tanks!!! asset reference” 坦克游戏作为多人在线游戏作为基础,相信很多人都不会陌生。大家可以在 Unity Asset Store 中搜到它。然后,我们会利用 Unity Asset Store 中的 Agora Voice SDK 为它增加多人语音聊天功能。

在开始前,你需要做以下准备:

  • 安装 Unity 并注册 Unity 账号

  • 了解如果在 Unity 中创建 iOS、Android 项目

  • 一款跨移动平台多玩家的 Unity 游戏(本文中我们选择的是 Tanks)

  • 了解 C# 和 Unity 脚本

  • 注册一个 Agora 开发者账户

  • 至少两个移动设备(如果有一个 iOS 设备,一个 Android 设备就再理想不过了)

  • 安装 Xcode

新建 Unity 项目

我们默认大家都是用过 Unity 的开发者,但是为了照顾更多的人。我们还是要从头讲起。当然,开始的操作步骤很简单,所以我们会尽量以图片来说明。

首先,打开 Unity 后,让我们先创建一个新的项目。

Qna2IvU.jpg!web

如果你之前已经下载过 Tanks!!! ,那么我们点击页面旁边的“Add Asset Package”按钮,选择添加它即可。

7JJbM3V.jpg!web

如果你还未下载过 Tanks!!! 那么可以在 Unity Store 中下载它。

qaeQVr3.jpg!web

在将 Tanks!!! 参考项目部署到手机之前,还有几步需要做。首先,我们需要在 Unity Dashboard 中,为这个项目开启 Unity Live Mode。该设置的路径是:project → Multiplayer → Unet Config。尽管 Tanks!!! 只支持最多四个玩家4,但我们在将“Max Player per room”设置为6。

77NJ3aY.jpg!web

iMBVv2I.jpg!web

图:这个界面说明 Unity Live Mode 已经开启

Building for iOS

现在我们已经准备好来创建 iOS 版本了。打开 Build Setting,将系统平台切换到 iOS,然后 Build。在切换系统平台后,请记得更新 Bundle Identifier(如下图所示)。

EbYZjai.jpg!web

nUF3iyy.jpg!web

图:创建了一个“Build”文件夹用于储存 iOS 项目

ee2YjyA.jpg!web

 图:Build 完成

让我们打开 Unity-iPhone.xcodeproj ,sign 并让它在测试设备上运行。

j6Jfiqr.jpg!web

现在我们已经完成了 iOS 项目的创建。接下来我们要创建 Android 项目了。

Building for Android

Android 项目相比 iOS 来讲要更简单一些。因为 Unity 可以直接创建、sign 和部署运行,无需借助 Android Studio。我默认大家已经将 Unity 与 Android SDK 文件夹关联起来了。现在我们要打开 Build Setting,然后将系统平台切换到 Android。

在我们创建并运行之前,我们还需要对代码做出一些简单的调整。我们只需要注释掉几行代码,加一个简单的返回声明,再替换一个文件。

背景信息:Tanks!!! Android 包含了 Everyplay 插件,用以实现游戏屏幕录制和分享。问题是,Everyplay 在2018年十月停止了服务,而插件仍然存在一些未解决的问题,如果我们不对其进行处理会导致编译失败。

首先,我们要纠正一下 Everyplay 插件 build.gradle 文件中的语法错误。该文件的路径是:Plugins → Android → everyplay → build.gradle。

MV36bmE.jpg!web

现在,我们打开了 gradle 文件,全选所有代码,然后将下方的代码替换上去。Tanks!!! 团队在 Github 上更新了代码,但是不知道为什么并没能更新到插件中。

最后我们要做的修改就是关闭 Everyplay。你可能想问:为什么我们要关闭 Everyplay 呢?因为当插件初始化时会导致 Android 应用崩溃。我发现最快速的方法就是在 EveryPlaySettings.cs 文件中更新几行代码(该文件的路径:Assets → Plugins → EveryPlay → Scripts),如此一来,每当 Everyplay 视图检测自身是否处于开启状态时,我们都会给它返回“false”

现在我们已经准备好 Build 了。在 Unity 中打开 Build Settings,选择 Android 平台,然后按下“Switch Platform”按钮。随后,在 Player Settings 中为 Android App 修改 bundle id。在这里,我使用的是 com.agora.tanks.voicedemo。

jYJvayy.jpg!web

集成语音聊天功能

接下来,我们要利用 Unity 中的 Agora voice SDK for Unity 来给跨平台项目增加语音聊天功能了。我们打开 Unity Asset Store ,搜索 Agora Voice SDK for Unity。

FZv6Vny.jpg!web

yYbAJrQ.jpg!web

当插件页面完成加载后,点击“Download”开始下载。下载完成后,选择“Import”,将它集成到你的项目中。

我们需要创建一个脚本来让游戏与 Agora Voice SDK 进行交互。我们在项目中新建一个 C# 文件(AgoraInterface.cs),然后在 Visual Studio 中打开它。

在这个脚本中有两个很重要的变量

先要将“Your Agora AppId Here” 替换成 App ID,我们可在登录 Agora.io ,进入 Agora Dashboard 获取。 mRtcEngine 是静态的,这样在 OnUpdate 调用的时候,才不会丢失。由于游戏中的其它脚本可能会引用 App ID,所以它是 public static

考虑到节省时间,我已经将 AgoraInterface.cs 的代码写好了(如下所示)。大家可以直接使用,避免重复造车轮。

在这里简单解释一下代码。首先,我们在开头有一些逻辑,用于 check/requset Android Permission。然后我们用 App ID 初始化 Agora RTC Engine,然后我们附加了一些事件回调,这部分很简单易懂。

mRtcEngine.OnJoinChannelSuccess 表示用户已经成功加入指定频道。

最后一个重要功能就是 update ,当启用了 Agora RTC Engine 时,我们想要调用引擎的 .Pull() 方法,它对于插件是否能运行起来很关键。

注意,以上代码可复用于所有 Unity 项目。

离开频道

如果你曾经使用过 Agora SDK,你可能注意到了,这里没有加入频道和离开频道。让我们先从“离开频道”开始动手,创建一个新的 C# 脚本 LeaveHandler.cs ,我们需要在用户返回到主菜单的时候调用 theleaveHandler 。最简单的方法就是在 LobbyScene 打开后,为特定游戏对象开启该方法。

在这里,我们要找的游戏对象是 LeftSubPanel (如下图,MainPanel → MenuUI → LeftSubPanel )。

neiaIrM.jpg!web

Tanks!!! 中有两种方法加入多人游戏,一种是创建新游戏,另一种是加入游戏。所以有两个地方,我们需要增加“加入频道”的命令。

让我们先找到 UI Script Asset 文件夹(该文件夹路径:Assets → Scripts → UI),然后打开 CreateGame.cs 文件。在第61行,你会找到游戏用于匹配玩家的方法,在这里我们可以加入一些逻辑用于加入频道。首先我们要做的就是应用 Agora SDK 库。

StartMatchmakingGame() 的第78行,我们需要加入一些逻辑来获取正在运行中的Agora RTC Engine,然后将“用户输入的内容”作为频道名称(m_MatchNameInput.text)。

StartMatchmakingGame()包含了加入频道

现在我们需要打开 LobbyServerEntry.cs (Assets → Scripts → UI),然后加入一些逻辑,以实现让用户可以通过“Find a Game”来加入其他人的房间。

在 Visual Studio 打开 LobbyServerEntry.cs ,然后找到第63行,这里有一个 JoinMatch() 。我们在第80行增加几行代码。

完成了!

现在我们已经完成了Agora SDK 的集成,并且已经准备好进行 iOS 端和 Android 端的 Build 与测试。我们可以参照上述内容中的方法来进行 Building 与部署。

为了便于大家参考,我已经将这份 Tutorial 中的脚本上传了一份到 Github,请点击 「阅读原文」 ,访问 RTC 开发者社区  获取。

如果你遇到 Agora SDK API 调用问题,可以参考我们的官方文档(docs.agora.io),也欢迎在 RTC 开发者社区 的 Agora 版块与我们的工程师和更多同行交流、分享。

neMJFzI.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK