我们在这里利用了Unity上流行的“Tanks!!!assetreference”坦克游戏作为多人在线游戏作为基础,相信很多人都不会陌生。大家可以在UnityAssetStore中搜到它。然后,我们会利用UnityAssetStore中的AgoraVoiceSDK为它增加多人语音聊天功能。
在开始前,你需要做以下准备:
我们默认大家都是用过Unity的开发者,但是为了照顾更多的人。我们还是要从头讲起。当然,开始的操作步骤很简单,所以我们会尽量以图片来说明。
首先,打开Unity后,让我们先创建一个新的项目。
如果你之前已经下载过Tanks!!!,那么我们点击页面旁边的“AddAssetPackage”按钮,选择添加它即可。
如果你还未下载过Tanks!!!那么可以在UnityStore中下载它。
在将Tanks!!!参考项目部署到手机之前,还有几步需要做。首先,我们需要在UnityDashboard中,为这个项目开启UnityLiveMode。该设置的路径是:project→Multiplayer→UnetConfig。尽管Tanks!!!只支持最多四个玩家4,但我们在将“MaxPlayerperroom”设置为6。
图:这个界面说明UnityLiveMode已经开启
现在我们已经准备好来创建iOS版本了。打开BuildSetting,将系统平台切换到iOS,然后Build。在切换系统平台后,请记得更新BundleIdentifier(如下图所示)。
图:创建了一个“Build”文件夹用于储存iOS项目
图:Build完成
让我们打开Unity-iPhone.xcodeproj,sign并让它在测试设备上运行。
现在我们已经完成了iOS项目的创建。接下来我们要创建Android项目了。
Android项目相比iOS来讲要更简单一些。因为Unity可以直接创建、sign和部署运行,无需借助AndroidStudio。我默认大家已经将Unity与AndroidSDK文件夹关联起来了。现在我们要打开BuildSetting,然后将系统平台切换到Android。
首先,我们要纠正一下Everyplay插件build.gradle文件中的语法错误。该文件的路径是:Plugins→Android→everyplay→build.gradle。
现在,我们打开了gradle文件,全选所有代码,然后将下方的代码替换上去。Tanks!!!团队在Github上更新了代码,但是不知道为什么并没能更新到插件中。
接下来,我们要利用Unity中的AgoravoiceSDKforUnity来给跨平台项目增加语音聊天功能了。我们打开UnityAssetStore,搜索AgoraVoiceSDKforUnity。
当插件页面完成加载后,点击“Download”开始下载。下载完成后,选择“Import”,将它集成到你的项目中。
我们需要创建一个脚本来让游戏与AgoraVoiceSDK进行交互。我们在项目中新建一个C#文件(AgoraInterface.cs),然后在VisualStudio中打开它。
在这个脚本中有两个很重要的变量:
在这里简单解释一下代码。首先,我们在开头有一些逻辑,用于check/requsetAndroidPermission。然后我们用AppID初始化AgoraRTCEngine,然后我们附加了一些事件回调,这部分很简单易懂。
mRtcEngine.OnJoinChannelSuccess表示用户已经成功加入指定频道。
最后一个重要功能就是update,当启用了AgoraRTCEngine时,我们想要调用引擎的.Pull()方法,它对于插件是否能运行起来很关键。
usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingagora_gaming_rtc;publicclassLeaveHandler:MonoBehaviour{//StartiscalledbeforethefirstframeupdatevoidOnEnable(){//Agora.ioImplimentationIRtcEnginemRtcEngine=IRtcEngine.GetEngine(AgoraInterfaceScript.appId);//GetareferencetotheEngineif(mRtcEngine!=null){Debug.Log("LeavingChannel");mRtcEngine.LeaveChannel();//leavethechannel}}}在这里,我们要找的游戏对象是LeftSubPanel(如下图,MainPanel→MenuUI→LeftSubPanel)。
Tanks!!!中有两种方法加入多人游戏,一种是创建新游戏,另一种是加入游戏。所以有两个地方,我们需要增加“加入频道”的命令。
让我们先找到UIScriptAsset文件夹(该文件夹路径:Assets→Scripts→UI),然后打开CreateGame.cs文件。在第61行,你会找到游戏用于匹配玩家的方法,在这里我们可以加入一些逻辑用于加入频道。首先我们要做的就是应用AgoraSDK库。
usingagora_gaming_rtc;在StartMatchmakingGame()的第78行,我们需要加入一些逻辑来获取正在运行中的AgoraRTCEngine,然后将“用户输入的内容”作为频道名称(m_MatchNameInput.text)。
privatevoidStartMatchmakingGame(){GameSettingssettings=GameSettings.s_Instance;settings.SetMapIndex(m_MapSelect.currentIndex);settings.SetModeIndex(m_ModeSelect.currentIndex);m_MenuUi.ShowConnectingModal(false);Debug.Log(GetGameName());m_NetManager.StartMatchmakingGame(GetGameName(),(success,matchInfo)=>{if(!success){m_MenuUi.ShowInfoPopup("Failedtocreategame.",null);}else{m_MenuUi.HideInfoPopup();m_MenuUi.ShowLobbyPanel();//Agora.ioImplimentationvarchannelName=m_MatchNameInput.text;//testing-->produse:m_MatchNameInput.textIRtcEnginemRtcEngine=IRtcEngine.GetEngine(AgoraInterfaceScript.appId);//GetareferencetotheEnginemRtcEngine.JoinChannel(channelName,"extra",0);//jointhechannelwithgivenmatchnameDebug.Log("joiningchannel:"+channelName);}});}StartMatchmakingGame()包含了加入频道
现在我们需要打开LobbyServerEntry.cs(Assets→Scripts→UI),然后加入一些逻辑,以实现让用户可以通过“FindaGame”来加入其他人的房间。
在VisualStudio打开LobbyServerEntry.cs,然后找到第63行,这里有一个JoinMatch()。我们在第80行增加几行代码。
privatevoidJoinMatch(NetworkIDnetworkId,StringmatchName){MainMenuUImenuUi=MainMenuUI.s_Instance;menuUi.ShowConnectingModal(true);m_NetManager.JoinMatchmakingGame(networkId,(success,matchInfo)=>{//Failureflowif(!success){menuUi.ShowInfoPopup("Failedtojoingame.",null);}//Successflowelse{menuUi.HideInfoPopup();menuUi.ShowInfoPopup("Enteringlobby...");m_NetManager.gameModeUpdated+=menuUi.ShowLobbyPanelForConnection;//Agora.ioImplimentationvarchannelName=matchName;//testing-->produse:matchNameIRtcEnginemRtcEngine=IRtcEngine.GetEngine(AgoraInterfaceScript.appId);//GetareferencetotheEnginemRtcEngine.JoinChannel(channelName,"extra",0);//jointhechannelwithgivenmatchname//testingstringjoinChannelMessage=string.Format("joiningchannel:{0}",channelName);Debug.Log(joinChannelMessage);}});}完成了!现在我们已经完成了AgoraSDK的集成,并且已经准备好进行iOS端和Android端的Build与测试。我们可以参照上述内容中的方法来进行Building与部署。
RTE开发者社区是聚焦实时互动领域的中立开发者社区。不止于纯粹的技术交流,我们相信开发者具备更加丰盈的个体价值。行业发展变革、开发者职涯发展、技术创业创新资源,我们将陪跑开发者,共享、共建、共成长。