近期,声网发布了基于 Native SDK 2.9.1 全平台接口的第一个全功能版 Agora Unity SDK,可用于基于 Unity 环境开发的游戏(不在乎包体大小)、教育、AR、VR 项目。咱们将讲解如何使用 Agora Video SDK for Untiy 在 Unity 中构建跨平台的实时视频聊天场景。git
在此以前,要说明一下,咱们在这篇教程中要用的 Agora Video SDK for Untiy ,与以前已经发布的 Agora 互动游戏 SDK for Unity 有不少差异,具体以下:github
也就是说,若是你开发的Unity 应用/游戏对安装包大小比较敏感,那么推荐使用 Agora 互动游戏 SDK for Unity,包体积占用最小可到 1MB;若是你的应用/游戏, 对安装包体积不那么敏感,或者有更多须要自定义音视频流的须要,那么可使用本篇教程的主角 Agora Video SDK for Unity。好了,咱们接下来开始讲讲怎么快速用起来。xcode
Unity Editorbash
了解 Unity Editor、GameObjects、Unity 脚本,以及如何将 Unity 应用发布到移动设备上app
对 C#的基本了解编辑器
Agora.io 开发人员账户ide
在进入主题以前,让咱们花点时间概览一下咱们将要完成的全部步骤函数
首先,让咱们打开 Unity 并建立一个空白的新项目,将其命名为Agora Video Demo。完成 Unity 的项目设置后,咱们导航到 Unity Asset Store,而后搜索“Agora Video SDK”。接下来,咱们将 Agora Video SDK for Unity 导入到咱们的项目中。当出现提示时,请确保选中列表中的全部Assets。测试
如今,咱们建立一个新 Scene,将其命名为 WelcomeScene,而后双击该场景在 Editor 视图中将其打开。应用被加载后,WelcomeScene 将是用户看到的首个画面。咱们首先从场景中删除现有的 Camera 和 Lights,而后咱们添加一个 Canvas GameObject。接下来咱们把“Camera”添加为“Canvas”的子对象。因为屏幕是以 2D 模式显示的,所以咱们将 Editor 切换为 2D 模式。咱们还须要把 Editor 视图切换到 Game 模式,以便咱们可以可视化与 Camera 视角相关的位置。 咱们须要一个按钮来触发应用执行“加入频道”的动做,为此咱们添加一个按钮并将其命名为 JoinChannel,并为其添加标签。咱们还须要让用户可以输入其频道的名称,为此咱们建立一个文本输入(InputFiled),将其命名为 ChannelName。ui
接下来,咱们将建立一个新场景并将其命名为 ChatScene,它是播放本地和远程视频流的屏幕。为了测试 Agora Video SDK 的某些功能,咱们为场景添加一些 3D 的 GameObject。首先,向场景添加一个 Cube。因为咱们的场景包含 3D,因此在编辑器中退出 2D 模式。 咱们但愿 Cube 将本地的摄像头视频流渲染为纹理,所以咱们须要添加 VideoSurface.cs 做为 Cube 的组件。咱们添加一个 Cylinder GameObject,将其移动到上方,使其不被 Cube 遮挡。接下来咱们给 Cylinder 调整一下 position,并添加 VideoSurface.cs 组件。 最后,咱们把 Canvas 添加到场景中,这样咱们就能够添加 2D 按钮以便退出聊天,咱们将其命名为 LeaveButton 并为其指定适当的标签。在此过程当中,咱们须要添加一个文本框,将其命名为 VersionText。咱们把 VersionText 放置在右上角使其不会遮挡画面,而后将颜色设置为白色以便易于查看。
在设置场景的过程当中,咱们建立了两个按钮(JoinButton 和 LeaveButton),如今咱们须要建立一个脚本,将一些 On Click Event 映射到这两个按钮上。
首先在 Assets 中建立一个新的 C#脚本,将其命名为 ButtonHandler.cs,而后双击它,在 Visual Studio 中打开文件。而后咱们添加一个函数 OnButtonClick(),为简化起见,咱们给函数主体中添加一个 Debug Log。
咱们回到 Unity 中的 WelcomeScene 并将脚本和函数attach到按钮上。首先选择 JoinButton 并将 ButtonHandler.cs 添加为组件。接下来添加一个 On Click event,并将按钮单击映射到 OnButtonClick()。而后咱们在 ChatScene 的 LeaveButton 上重复此过程。
此外须要注意的是,咱们须要引入UnityEngine.UI,而后才能从 ChannelNameGameObject 获取 InputFiled 组件。
public void OnButtonClick()
{
Debug.Log("Button Clicked: " + name);
// determin which button
if (name.CompareTo("JoinButton") == 0)
{
// join chat
OnJoinButtonClicked();
}
else if (name.CompareTo("LeaveButton") == 0)
{
// leave chat
OnLeaveButtonClicked();
}
}
private void OnJoinButtonClicked()
{
Debug.Log("Join button clicked");
// get channel name from text input
GameObject go = GameObject.Find("ChannelName");
InputField input = go.GetComponent<InputField>();
}
private void OnLeaveButtonClicked()
{
Debug.Log("Leave button clicked");
}
复制代码
首先,咱们在 Assets 中建立一个新的 C#脚本,将其命名为 AgoraInterface.cs,而后在 Visual Studio 中打开该文件。咱们建立的第一个变量是 appId,用来保存咱们的 Agora AppID。复制你的 AppID 并将其粘贴到 appId 的值中。咱们还须要建立一个变量来保存远端视屏流的uid。
private static string appId = "Agora App ID";
public IRtcEngine mRtcEngine;
public uint mRemotePeer;
复制代码
让咱们建立一个函数来初始化 Agora mRtcEngine,咱们将其称为 LoadEngine()。咱们确保引擎仅被初始化一次。咱们使用if语句来检查 mRtcEngine 引用是否为 null。若是结果为 true,咱们使用 IRtcEngine.getEngine 传入咱们的 Agora 的 AppID 来初始化引擎。
接下来,咱们将声明 JoinChannel() 函数。首先检查 mRtcEngine 是否存在,而后咱们调用 EnableVideo 和 EnableVideoObserver,最后咱们调用 JoinChannel。
到目前为止,咱们已经初始化了 Agora mRtcEngine,并用它来支持“加入频道”功能。如今咱们须要为用户提供一种“离开频道”并“卸载”引擎的方法。咱们从 LeaveChannel() 开始,再次检查引擎是否存在,而后用引擎调用 LeaveChannel() 和 DisabelVideoObserver()。最后,咱们调用 IRtcEngine.Destroy(),并将本地引用设置为 null 来卸载引擎。
咱们准备添加一些回调函数,以即可以基于各类预约义事件进行调用。咱们重点关注三个回调:OnChannelJoinSuccess、OnUserJoined 和 OnUserOffline。只要本地设备成功加入频道,就会调用 OnChannelJoinSuccess;每当远程流加入频道时,就会调用 OnUserJoined;每当远端流离开频道时,就会调用 OnUserOffline。 在调用 JoinChannel 以后,咱们在 OnJoinButtonClicked 中向 SceneManager 的 SceneLoaded 监听器添加一个回调,而后将函数命名为 OnSceneFinishedLoading。因为每次加载场景时都会调用回调,所以咱们须要一个中间函数。
在设备上测试咱们的工做成果以前,咱们须要为 Android 添加一些权限请求。从 Unity 2018_3 开始,权限再也不自动添加,所以咱们须要添加一些 if-else 语句来检查并请求麦克风和摄像头的权限。
终于能够测试咱们的应用了!让咱们回到 Unity 并打开“Build Settings”。首先,咱们将 WelcomeScene 和 ChatScene 拖到“Build Settings”对话框的 Scene 列表中。
在构建和部署咱们的应用以前,咱们须要对每一个平台的播放器设置进行一些调整。咱们须要更新 Bundle ID,并提供一些有关摄像头和麦克风使用状况的描述文本(启用权限提示)。
如今咱们准备构建咱们的应用!在“BuildSettings ”对话框中,单击“Build ”按钮,Unity 将提示你输入保存构建的位置。Unity 完成构建 iOS 应用后,将出现包含 Unity-iPhone.xcodeproj的Finder 窗口,双击该文件打开 XCode。打开 XCode后,选择项目(从左侧的文件导航器中),启用“AutomaticSigning ”并选择你的签名证书。最后,确保已链接测试设备,而后单击“播放”按钮。
一样的,咱们这个版本也支持 Windows 和 macOS,如图所示:
你能够看到 WelcomeScene 先被加载,当咱们加入频道时,咱们进入 ChatScene,而当咱们单击“Leave ”按钮时,将返回 WelcomeScene。惟一缺乏的是远程流,为了实现远端视频流,咱们须要第二个设备。 此外,咱们也支持 Android。从“Platform ”列表中选择“Android”,打开“Player Settings”并提供一个 Package Name。确保已链接你的 Android 设备,而后单击“BuildAnd Run”。
搞定!
给你点赞,又搞定一个“小目标”!若是你有任何新的想法,或遇到什么问题,欢迎点击「阅读原文」到 RTC 开发者社区与咱们交流。
咱们在 Github 开源了 Unity SDK 的相关代码示例,具体能够参考:github.com/AgoraIO/Ago…
可在Unity Asset Store上获取Agora.io Video SDK for Unity
完整的 API 文档可在声网文档中心找到:docs.agora.io/cn/Video/re…
若是在集成中遇到问题, 你能够到 RTC 开发者社区提问
你可能会问,为何是 getEngine() 而不是新的 IRtcEngine(),这与 Agora mRtcEngine 做为单例运行有关。getEngine() 将检查实例是否存在,若是不存在,则建立一个新实例。getEngine() 函数也能够稍后被调用以从代码的其余部分获取对引擎的引用。
全部回调在AgoraGameRtcEngine.cs中可见(Assets → /Scripts → /AgoraGamingSDK)。
注意:每一个回调函数都会传递一组特定的参数,所以,若是你打算添加其余任何回调,请务必查看 AgoraGameRtcEngine.cs 文件