QCon全球软件开发大会8折优惠倒计时最后3天,购票立减¥1760!了解详情 >>> 了解详情
写点什么

Agora 教程 | 如何在 Unity 中创建实时视频聊天应用

2020 年 2 月 25 日

Agora 教程 | 如何在 Unity 中创建实时视频聊天应用

由于近期 RTC 应用场景备受关注,我们整理了基于 Agora SDK 快速实现实时音视频场景的基础教程。本系列教程将分为三期,本次是第三期。分享基于 Agora SDK 跨平台开发实时音视频应用,包括 Unity、Cocos、Flutter、Electron 和 Qt。


声网发布了基于 Native SDK 2.9.1 全平台接口的第一个全功能版 Agora Unity SDK,可用于基于 Unity 环境开发的游戏(不在意包体大小)、教育、AR、VR 项目。我们将讲解如何使用 Agora Video SDK for Untiy 在 Unity 中构建跨平台的实时视频聊天场景。


在此之前,要说明一下,我们在这篇教程中要用的 Agora Video SDK for Untiy ,与之前已经发布的 Agora 互动游戏 Unity SDK 有很多差别,具体如下:



准备工作

  • Unity Editor

  • 了解 Unity Editor、GameObjects、Unity 脚本,以及如何将 Unity 应用发布到移动设备上

  • 对 C#的基本了解

  • Agora.io 开发人员帐户


概述

在进入主题之前,让我们花点时间概览一下我们将要完成的所有步骤


1.设立新项目并导入 Agora Video SDK for Untiy


2.创建场景


3.处理按钮的事件


4.集成 Agora SDK


5.在设备上构建和测试(iOS/Android/Windows/macOS)


创建新项目

首先,让我们打开 Unity 并创建一个空白的新项目,将其命名为 Agora Video Demo。完成 Unity 的项目设置后,我们导航到 Unity Asset Store,然后搜索“Agora Video SDK”。接下来,我们将 Agora Video SDK for Unity 导入到我们的项目中。当出现提示时,请确保选中列表中的所有 Assets。



创建 Scene

现在,我们创建一个新 Scene,将其命名为 WelcomeScene,然后双击该场景在 Editor 视图中将其打开。应用被加载后,WelcomeScene 将是用户看到的首个画面。我们首先从场景中删除现有的 Camera 和 Lights,然后我们添加一个 Canvas GameObject。接下来我们把“Camera”添加为“Canvas”的子对象。由于屏幕是以 2D 模式显示的,因此我们将 Editor 切换为 2D 模式。我们还需要把 Editor 视图切换到 Game 模式,以便我们能够可视化与 Camera 视角相关的位置。


我们需要一个按钮来触发应用执行“加入频道”的动作,为此我们添加一个按钮并将其命名为 JoinChannel,并为其添加标签。我们还需要让用户能够输入其频道的名称,为此我们创建一个文本输入(InputFiled),将其命名为 ChannelName。



接下来,我们将创建一个新场景并将其命名为 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");}
复制代码


集成 Agora SDK

首先,我们在 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,如图所示:



图:Windows 中的操作



图:macOS 中的操作


你可以看到 WelcomeScene 先被加载,当我们加入频道时,我们进入 ChatScene,而当我们单击“Leave ”按钮时,将返回 WelcomeScene。唯一缺少的是远程流,为了实现远端视频流,我们需要第二个设备。此外,我们也支持 Android。从“Platform ”列表中选择“Android”,打开“Player Settings”并提供一个 Package Name。确保已连接你的 Android 设备,然后单击“BuildAnd Run”。!



## 搞定!给你点赞,又搞定一个“小目标”!如果你有任何新的想法,或遇到什么问题,欢迎点击「阅读原文」到 RTC 开发者社区与我们交流。### 其它资源


• 我们在 Github 开源了 Unity SDK 的相关代码示例,具体可以参考:https://github.com/AgoraIO/Agora-Unity-Quickstart/tree/master/video/Hello-Video-Unity-Agora


• 可在 Unity Asset Store 上获取 Agora.io Video SDK for Unity


• 完整的 API 文档可在声网文档中心找到:https://docs.agora.io/cn/Video/release_unity_video?platform=Unity


• 如果在集成中遇到问题, 你可以到 RTC 开发者社区提问


备注

  1. 你可能会问,为什么是 getEngine() 而不是新的 IRtcEngine(),这与 Agora mRtcEngine 作为单例运行有关。getEngine() 将检查实例是否存在,如果不存在,则创建一个新实例。getEngine() 函数也可以稍后被调用以从代码的其他部分获取对引擎的引用。

  2. 所有回调在 AgoraGameRtcEngine.cs 中可见(Assets → /Scripts → /AgoraGamingSDK)。


注意:每个回调函数都会传递一组特定的参数,因此,如果你打算添加其他任何回调,请务必查看 AgoraGameRtcEngine.cs 文件


本文转载自声网 Agora 公众号。


原文链接:https://mp.weixin.qq.com/s/82ayGckZEkUE0j6hZsGRUw


2020 年 2 月 25 日 17:45235

评论

发布
暂无评论
发现更多内容

C语言中“野指针”、“悬空指针”是什么?

不脱发的程序猿

c 指针 编程之路 bug 3月日更

【LeetCode】不同的子序列Java题解

HQ数字卡

算法 LeetCode 28天写作 3月日更

电商千万级交易的金手指:分布式事务管理

华为云开发者社区

微服务 事务 华为云 分布式事务管理 DTM

看故事学Redis:再不懂,我怀疑你是假个开发

华为云开发者社区

MySQL 数据库 redis 缓存 数据

第8周大作业

八达鸟

寻找被遗忘的勇气(十七)

Changing Lin

3月日更

SDK 是如何存储事件数据的?

神策技术社区

ios 大数据 存储 数据采集 神策数据

你遇到过哪些质量很高的 Java 面试?

张小方

Java 面试 阿里 薪资

多端框架开发 | 拼团商城项目开发说明

APICloud

小程序云开发 前端 移动终端 APP开发 多端开发

电影AI修复,让重温经典有了新的可能

华为云开发者社区

电影 华为云视频 AI修复 视频增强 经典

怎么找属于自己最优的2B增长模型?

boshi

销售管理 SaaS 七日更

智慧公安二维码定位报警系统开发,微警务平台解决方案

源中瑞-龙先生

二维码定位报警系统开发 智慧公安 智慧公安扫码

阿里P8大牛亲自讲解!2021年Android网络编程总结篇,醍醐灌顶!

欢喜学安卓

android 程序员 面试 移动开发

阿里P8大牛亲自教你!一个三非渣本的Android校招秋招之路,满满干货指导

欢喜学安卓

android 程序员 面试 移动开发

OpenKruise v0.8.0 核心能力解读:管理 Sidecar 容器的利器

阿里巴巴云原生

容器 微服务 云原生 k8s 应用服务中间件

Oracle Sql性能优化

大数据技术指南

oracle 大数据 28天写作 3月日更

TcaplusDB君 · 行业新闻汇编(3月17日)

TcaplusDB

数据库 nosql 后端 TcaplusDB Tcaplus

带你走进与千万数据通信者共成长的“家园”

华为云开发者社区

华为 开发者 网络 华为数据通信 社区

朋友,你听说过跨域吗

河磨

spring CORS 跨域

数据驱动业务:一张大屏掌控城市运行,效率提高95%

一只数据鲸鱼

物联网 数据可视化 智慧城市 智慧园区 智慧交通

EGG公链生态项目——EFTalk上的巴莱特定律

币圈那点事

区块链

跟公司新招的这个“同事”搭档,工作搬砖太“自动化”了

华为云开发者社区

华为 AI RPA 自动化 员工

一招让Kafka达到最佳吞吐量

万俊峰Kevin

go kafka go-zero

架构师训练营第十一周作业 - 命题作业

阿德儿

拍乐云创始人&CEO赵加雨:深耕18载,打造全景式音视频服务

拍乐云Pano

音视频 WebRTC 在线教育 RTC 实时通信

图解堆排序

Silently9527

Java 排序算法 堆排序

LeetCode题解:647. 回文子串,动态规划,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

沙龙报名 | 云计算进入多元架构,云原生时代的挑战与机遇

京东科技开发者

云计算 云原生

JVM笔记 -- 来,教你类加载子系统

秦怀杂货店

Java JVM 类加载 虚拟机

JDK8新特性 Fork/Join 的优化

Java小咖秀

Java java8 jdk8 forkjoin fork

有道技术沙龙 | AI 语音交互技术在语言学习场景的实践

有道技术团队

人工智能

移动应用开发的下一站

移动应用开发的下一站

Agora 教程 | 如何在 Unity 中创建实时视频聊天应用-InfoQ