产品百科 |零门槛玩转 RTC Unity Demo

简介: 本章节为您介绍了 Unity Demo 的集成操作步骤。

本章节为您介绍了 Unity Demo 的集成操作步骤。

前提条件

您需要开通阿里云 RTC 服务并在控制台成功创建应用,具体操作请参见入门概述

获取 Token,详情请参见服务端生成 Token

创建 Unity 项目

  1. 打开 Unity,单击新建
  2. 输入项目名称、项目保存位置,并选择 3D 模版。
  3. 单击创建image.png

集成 SDK

  1. 下载 Unity SDK解压后包含 sample 和 sdk 两个目录,sample 目录为 Unity 对接工程,sdk 目录为 Unity 版本 SDK。
  2. 在项目 Assets 目录下新建 Plugins 目录。
  3. 复制 SDK 中以下目录文件到项目 Plugins 目录。
平台 文件或文件夹 项目路径
Android /Android/AliRtcCwrapper.aar /Assets/Plugins/Android
/Android/AliRTCSdk.jar /Assets/Plugins/Android
/Android/alivc-core-rtc.aar /Assets/Plugins/Android
/Android/Sophonsdk.aar /Assets/Plugins/Android
/Android/utdid4all-1.5.0-proguard.jar /Assets/Plugins/Android
/Android/webrtclib.aar /Assets/Plugins/Android
iOS /iOS/AliRTCSdk.framework /Assets/Plugins/iOS
/iOS/libAliRTCSdkCInterface.a /Assets/Plugins/iOS
macOS /macOS/AliRTCSdkCWrapper.bundle /Assets/Plugins/macOS
Windows /x86/AliRTCSdk.dll /Assets/Plugins/x86
/x86/AliRTCSdkCWrapper.dll /Assets/Plugins/x86
/x64/AliRTCSdk.dll /Assets/Plugins/x64
/x64/AliRTCSdkCWrapper.dll /Assets/Plugins/x64

  1. 在项目 Assets 目录下新建 Scripts 目录。
  2. 复制 SDK 中以下目录文件到项目 Scripts 目录。
文件 项目路径
/Scripts/AliRtcEngine.cs /Assets/Scripts
/Scripts/IAliRtcEngineBase.cs /Assets/Scripts
/Scripts/VideoDisplaySurface.cs /Assets/Scripts

实现音视频通话功能

  1. 添加 UI 控制。您可以创建用户界面,以 Unity Sample 为例,创建本地视频窗口 GameObject(LocalVideoCube)和远端视频窗口 GameObject(RemoteVideoCube),以及控制按钮 ControlButton。image.png
  2. UI 界面保存到 /Assets/Scenes/SampleScene.unity
  3. 创建控制音视频通信功能的 Home.cs 文件,并将该文件添加到主 Main Camera,使得 Home.cs 文件在 Main Camera 启动时就被加载。
  4. 获取权限(仅 Android 操作)。在 UNITY_2018_3_OR_NEWER 及以上版本,Android 设备需要在 Unity 中设置主动向用户获取麦克风和相机权限,需要调用 CheckPermission 主动获取权限。
private ArrayList permissionList = new ArrayList();
void Start ()
{
#if (UNITY_2018_3_OR_NEWER && UNITY_ANDROID)
    permissionList.Add(Permission.Microphone);
    permissionList.Add(Permission.Camera);
#endif
}
void Update ()
{
#if (UNITY_2018_3_OR_NEWER && UNITY_ANDROID)
    CheckPermission();
#endif
}
private void CheckPermission()
{
#if (UNITY_2018_3_OR_NEWER && UNITY_ANDROID)
    foreach (string permission in permissionList)
    {
        if (Permission.HasUserAuthorizedPermission(permission))
        {
        }
        else
        {
            Permission.RequestUserPermission(permission);
        }
    }
#endif
}
  1. 此外,集成 Android 平台时,需要 AndroidManifest.xml 文件和 project.properties 文件来管理项目权限和项目属性,可以直接拷贝 AliRTCSdkEngine.plugin 目录到 / Assets/Plugins/Android。image.png
  2. 初始化 IAliRtcEngine。执行创建 IAliRtcEngine,根据需要注册侦听通知回调,设置自动推流订阅模式。
string extra = "";
IAliRtcEngine mRtcEngine = IAliRtcEngine.GetEngine (extra);
mRtcEngine.OnJoinChannelNotify = onJoinChannelNotify;
mRtcEngine.OnPublishNotify = onPublishNotify;
mRtcEngine.OnSubscribeNotify = onSubscribeNotify;
mRtcEngine.OnRemoteUserOnLineNotify = onRemoteUserOnLineNotify;
mRtcEngine.OnRemoteUserOffLineNotify = onRemoteUserOffLineNotify;
mRtcEngine.OnRemoteTrackAvailableNotify = onRemoteTrackAvailableNotify;
mRtcEngine.OnSubscribeChangedNotify = onSubscribeChangedNotify;
mRtcEngine.OnLeaveChannelResultNotify = onLeaveChannelResultNotify;
mRtcEngine.SetAutoPublish(true, true);
  1. 打开本地预览。进入频道前需要启动本地视频采集预览显示,获取 UI 中 VideoCube 对象,添加 VideoDisplaySurface 到 VideoCube 上。说明VideoDisplaySurface 是 SDK 封装用于视频渲染的 C# 类,任何 Unity 中 GameObject 物体上需要显示视频内容,必须要绑定 VideoDisplaySurface。VideoDisplaySurface 主要有以下三个功能:
  • void SetUserId (string uid):设置渲染视频的用户 ID,本地 uid 填空字符串 ""
  • void SetVideoTrack (AliRTCVideoTrack track):设置视频流类型,有 camera(相机流)和 screen(共享流)两种,用于区分同一用户 ID 推送的两种不同的是视频流。
  • void SetEnable (bool enable):控制视频是否显示。
  1. 添加 surface 后,调用 IAliRtcEngine 接口设置本地预览和开启预览。
GameObject go = GameObject.Find("LocalVideoCube");
VideoDisplaySurface surface = go.GetComponent<VideoDisplaySurface>();
surface.SetUserId("");
surface.SetVideoTrack(AliRTCVideoTrack.VIDEO_TRACK_CAMERA);
surface.SetEnable(true);
mRtcEngine.SetLocalViewConfig(true);
mRtcEngine.ConfigExternalVideoRendering(true);
mRtcEngine.StartPreview();
  1. 获取频道鉴权信息。该步骤主要通过和 AppServer 进行通信,获取进入的频道名称以及对应的鉴权信息,成功获取到的信息需要保存在 AliRTCAuthInfo 结构中。
  2. 加入频道。成功获取到入会鉴权信息后,通过调用接口 JoinChannel 加入频道,需要传递参数有 AliRTCAuthInfo 和用户名称。调用加入频道接口后,SDK 会通过 OnJoinChannelNotify 通知回调是否入会成功,参数 errorCode 为 0 表示入会成功,其他表示失败。
mRtcEngine.JoinChannel(authInfo, "userName");
private void onJoinChannelNotify (int errorCode)
{
    if (errorCode == 0)
    {
        Debug.Log("加入频道成功");
    }
    else
    {
        Debug.Log("加入频道失败");
    }
}
  1. 远端用户视频显示。订阅远端用户的音视频流相关的回调是 onSubscribeChangedNotify,控制远端用户视频的显示在该回调中实现。onSubscribeChangedNotify 有三个参数:
  • userId 表示远端用户 ID。
  • audioTrack 有 mic(麦克风)和 none 两种类型,none 表示当前没有远端音频流。
  • videoTrack 有 camera、screen、both 和 none 四种类型,分别表示该用户的视频流状态,both 表示同时订阅远端用户的 camera(相机流)和 screen(共享流),none 表示当前没有远端视频流。
  1. 在回调中,检查参数 videoTrack 是否为 camera、screen、both 三者中的一种,如果是需要使用 GameObject 对象进行显示,并添加 VideoDisplaySurface,如果 videoTrack 为 none,需要控制 GameObject 对象取消显示。
private void onSubscribeChangedNotify (string userId, int audioTrack, int videoTrack)
{
    if (videoTrack == (int)AliRTCVideoTrack.VIDEO_TRACK_CAMERA)
    {
        GameObject go = GameObject.Find("RemoteVideoCube");
        if (!ReferenceEquals(go, null))
        {
            VideoDisplaySurface surface = go.GetComponent<VideoDisplaySurface>();
            surface.SetUserId(userId);
            surface.SetVideoTrack(AliRTCVideoTrack.VIDEO_TRACK_CAMERA);
            surface.SetEnable(true);
        }
    }
    else if (videoTrack == (int)AliRTCVideoTrack.VIDEO_TRACK_NONE)
    {
        GameObject go = GameObject.Find("RemoteVideoCube");
        if (!ReferenceEquals(go, null))
        {
            VideoDisplaySurface surface = go.GetComponent<VideoDisplaySurface>();
            surface.SetEnable(false);
        }
    }
}
  1. 离开频道。结束音视频通话时调用接口 LeaveChannel 离开频道,离开频道前需要关闭本地预览以及移除远端视频显示。
mRtcEngine.StopPreview();
GameObject go = GameObject.Find("LocalVideoCube");
VideoDisplaySurface surface = go.GetComponent<VideoDisplaySurface>();
surface.SetEnable(false);
go = GameObject.Find("RemoteVideoCube");
surface = go.GetComponent<VideoDisplaySurface>();
surface.SetEnable(false);
mRtcEngine.LeaveChannel();
  1. 销毁 IAliRtcEngine。调用 IAliRtcEngine 的 Destroy 方法退出 App 或者释放内存。

Unity Editor 中调试

Unity Editor 中调试只需要确保放入 macOS 或 Windows 所需的文件或文件夹到 /Assets/Plugins 目录即可。

工程导出设置

  • Mac 平台:Unity 编译导出 Mac 平台应用,macOS10.15 以下版本无需做额外设置,只需选中 Target Platform 为 Mac OS, 勾上 Development Build 即可;macOS10.15 及以上版本需要选择 Player Settings,在 Player 的 Other Settings 选项中,将 Camera Usage Description 文本框中添加 open camera 字符串,Microphone Usage Description 文本框中添加 open microphone 字符串。image.png
  • iOS 平台:设置 Graphics APIs 为 OpenGLES2,去掉多线程渲染 Multithreaded Rendering。
    image.pngimage.pngiOS 导出为 xcode 工程,在 xcode 工程中需要先关闭 bitcode,在 info.plist 文件中添加麦克风和相机访问,并且在 Embed Framework 中添加 AliRTCSdk.framework,开启 background 模式,以上设置也可以在 Unity 打包后处理脚本中添加导出的工程设置。
  • Android 平台:Android 应用导出前,切换到 Android Platform,选择 Player Settings,在 Player 的 Other Settings 选项中,设置 Graphics APIS 为 OpenGLES2,去掉多线程渲染 Multithreaded Rendering,Scripting Backend 选择 IL2CPP。
    image.pngimage.png
    说明 默认 Android 打包 ARMv7 版本,如果打包 ARM64 版本,需要选中 Target Architectures 中 ARM64 选项。
    选中该 Export Project 后导出目录需要有子级文件夹,例如可导出在以下目录:Aliyun/UnityRTCimage.png
  • Windows 平台:Windows 应用导出前,切换到 PC Platform,选择 Player Settings,在 Player 的 Scripting Backend 选项选中 Mono。

image.png


「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

image.png

相关文章
|
API 图形学
【unity实践demo】unity-2D游戏官方案例【2】
【unity实践demo】unity-2D游戏官方案例【2】
285 0
|
API 图形学
unity之子弹发射小demo
unity之子弹发射
211 0
|
传感器 编解码 5G
Unity配置Android开发环境与第一个Demo
ARFoundation之路-环境配置(Android)
549 0
Unity配置Android开发环境与第一个Demo
|
Java C# vr&ar
用Unity做一个小Demo入门Unity
用Unity做一个小Demo入门Unity
1109 0
用Unity做一个小Demo入门Unity
|
XML Java 语音技术
Unity -Demo 之 ✨ 语音识别-讯飞SDK使用过程
因为工作需求,现在要选择连接一个语音识别功能接入系统中,所以目前正在尝试使用讯飞的语音识别SDK进行连接。 在使用语音识别的sdk之前先查阅了一下语音识别的基本知识 然后去讯飞的官网注册信息并创建一个应用用于使用SDK 基本步骤处理完了,下面就是下载SDK进行集成使用了,我这里用的是语音唤醒的SDK,按照官方教程做就行。教程在这-语音唤醒SDK教程 当上面这几步做完了之后,接下来就是将这个工程打包成给unity使用的aar包了。可以参考这个教程:将Android Studio的工程打包成aar包给unity使用
|
图形学 Android开发
Unity3dAds广告插件的使用(附Demo)
这次我们学习一个方便在unity内进行接入广告平台,就是unityAds,这个广告平台是视频广告,可以在游戏暂停的时候全屏显示。最重要的是在unity里面接入极为方便! 附上简洁的代码(底部附有Demo下载地址): using UnityEngine; using System.
1376 0
|
图形学
Unity 3D中 Ulua-UGUI简单的Demo——热更新的具体流程、使用说明
Ulua热更新具体流程、使用说明 本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) ...
1342 0
Unity 3D换装系统教程/Demo
Unity3D换装系统教程 本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) 1 Costume Change —— 换装系统 1 Costume Change —— 换装系统 END 本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。
1541 0
|
图形学
Unity ---WidgetsUI CreateTileView Demo
以下教程基于:WidgetsUI 第三方扩展包 WidgtsUI 官网文档地址:https://ilih.ru/unity-assets/UIWidgets/docs/ 1、创建一个空GameObject重命名为TileView 2、再TileView中添加ScrollRect,将ViewPo...
1021 0