近期,聲網(wǎng)發(fā)布了基于 Native SDK 2.9.1 全平臺接口的第一個全功能版 Agora Video SDK for Unity,可用于基于 Unity 環(huán)境開發(fā)的游戲(不在意包體大小)、教育、AR、VR 項目。我們將講解如何使用 Agora Video SDK for Untiy 在 Unity 中構(gòu)建跨平臺的實時視頻聊天場景。
在此之前,要說明一下,我們在這篇教程中要用的 Agora Video SDK for Untiy ,與之前已經(jīng)發(fā)布的 Agora 互動游戲 SDK for Unity 有很多差別,具體如下:
也就是說,如果你開發(fā)的Unity 應(yīng)用/游戲?qū)Π惭b包大小比較敏感,那么推薦使用 Agora 互動游戲 SDK for Unity,包體積占用最小可到 1MB;如果你的應(yīng)用/游戲, 對安裝包體積不那么敏感,或者有更多需要自定義音視頻流的需要,那么可以使用本篇教程的主角 Agora Video SDK for Unity。好了,我們接下來開始講講怎么快速用起來。
準(zhǔn)備工作
Unity Editor
了解 Unity Editor、GameObjects、Unity 腳本,以及如何將 Unity 應(yīng)用發(fā)布到移動設(shè)備上
對 C#的基本了解
Agora.io 開發(fā)人員帳戶
概述
在進(jìn)入主題之前,讓我們花點時間概覽一下我們將要完成的所有步驟
- 設(shè)立新項目并導(dǎo)入 Agora Video SDK for Untiy
- 創(chuàng)建場景
- 處理按鈕的事件
- 集成 Agora SDK
- 在設(shè)備上構(gòu)建和測試(iOS/Android/Windows/macOS)
創(chuàng)建新項目
首先,讓我們打開 Unity 并創(chuàng)建一個空白的新項目,將其命名為Agora Video Demo。完成 Unity 的項目設(shè)置后,我們導(dǎo)航到 Unity Asset Store,然后搜索“Agora Video SDK”。接下來,我們將 Agora Video SDK for Unity 導(dǎo)入到我們的項目中。當(dāng)出現(xiàn)提示時,請確保選中列表中的所有Assets。
創(chuàng)建 Scene
現(xiàn)在,我們創(chuàng)建一個新 Scene,將其命名為 WelcomeScene,然后雙擊該場景在 Editor 視圖中將其打開。應(yīng)用被加載后,WelcomeScene 將是用戶看到的首個畫面。我們首先從場景中刪除現(xiàn)有的 Camera 和 Lights,然后我們添加一個 Canvas GameObject。接下來我們把“Camera”添加為“Canvas”的子對象。由于屏幕是以 2D 模式顯示的,因此我們將 Editor 切換為 2D 模式。我們還需要把 Editor 視圖切換到 Game 模式,以便我們能夠可視化與 Camera 視角相關(guān)的位置。
我們需要一個按鈕來觸發(fā)應(yīng)用執(zhí)行“加入頻道”的動作,為此我們添加一個按鈕并將其命名為 JoinChannel,并為其添加標(biāo)簽。我們還需要讓用戶能夠輸入其頻道的名稱,為此我們創(chuàng)建一個文本輸入(InputFiled),將其命名為 ChannelName。
接下來,我們將創(chuàng)建一個新場景并將其命名為 ChatScene,它是播放本地和遠(yuǎn)程視頻流的屏幕。為了測試 Agora Video SDK 的某些功能,我們?yōu)閳鼍疤砑右恍?3D 的 GameObject。首先,向場景添加一個 Cube。由于我們的場景包含 3D,所以在編輯器中退出 2D 模式。
我們希望 Cube 將本地的攝像頭視頻流渲染為紋理,因此我們需要添加 VideoSurface.cs 作為 Cube 的組件。我們添加一個 Cylinder GameObject,將其移動到上方,使其不被 Cube 遮擋。接下來我們給 Cylinder 調(diào)整一下 position,并添加 VideoSurface.cs 組件。
最后,我們把 Canvas 添加到場景中,這樣我們就可以添加 2D 按鈕以便退出聊天,我們將其命名為 LeaveButton 并為其指定適當(dāng)?shù)臉?biāo)簽。在此過程中,我們需要添加一個文本框,將其命名為 VersionText。我們把 VersionText 放置在右上角使其不會遮擋畫面,然后將顏色設(shè)置為白色以便易于查看。
處理按鈕事件
在設(shè)置場景的過程中,我們創(chuàng)建了兩個按鈕(JoinButton 和 LeaveButton),現(xiàn)在我們需要創(chuàng)建一個腳本,將一些 On Click Event 映射到這兩個按鈕上。
首先在 Assets 中創(chuàng)建一個新的 C#腳本,將其命名為 ButtonHandler.cs,然后雙擊它,在 Visual Studio 中打開文件。然后我們添加一個函數(shù) OnButtonClick(),為簡化起見,我們給函數(shù)主體中添加一個 Debug Log。
我們回到 Unity 中的 WelcomeScene 并將腳本和函數(shù)attach到按鈕上。首先選擇 JoinButton 并將 ButtonHandler.cs 添加為組件。接下來添加一個 On Click event,并將按鈕單擊映射到 OnButtonClick()。然后我們在 ChatScene 的 LeaveButton 上重復(fù)此過程。
此外需要注意的是,我們需要引入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 中創(chuàng)建一個新的 C#腳本,將其命名為 AgoraInterface.cs,然后在 Visual Studio 中打開該文件。我們創(chuàng)建的第一個變量是 appId,用來保存我們的 Agora AppID。復(fù)制你的 AppID 并將其粘貼到 appId 的值中。我們還需要創(chuàng)建一個變量來保存遠(yuǎn)端視屏流的uid。
private static string appId = "Agora App ID";
public IRtcEngine mRtcEngine;
public uint mRemotePeer;
讓我們創(chuàng)建一個函數(shù)來初始化 Agora mRtcEngine,我們將其稱為 LoadEngine()。我們確保引擎僅被初始化一次。我們使用if語句來檢查 mRtcEngine 引用是否為 null。如果結(jié)果為 true,我們使用 IRtcEngine.getEngine 傳入我們的 Agora 的 AppID 來初始化引擎。
接下來,我們將聲明 JoinChannel() 函數(shù)。首先檢查 mRtcEngine 是否存在,然后我們調(diào)用 EnableVideo 和 EnableVideoObserver,最后我們調(diào)用 JoinChannel。
到目前為止,我們已經(jīng)初始化了 Agora mRtcEngine,并用它來支持“加入頻道”功能?,F(xiàn)在我們需要為用戶提供一種“離開頻道”并“卸載”引擎的方法。我們從 LeaveChannel() 開始,再次檢查引擎是否存在,然后用引擎調(diào)用 LeaveChannel() 和 DisabelVideoObserver()。最后,我們調(diào)用 IRtcEngine.Destroy(),并將本地引用設(shè)置為 null 來卸載引擎。
我們準(zhǔn)備添加一些回調(diào)函數(shù),以便可以基于各種預(yù)定義事件進(jìn)行調(diào)用。我們重點關(guān)注三個回調(diào):OnChannelJoinSuccess、OnUserJoined 和 OnUserOffline。只要本地設(shè)備成功加入頻道,就會調(diào)用 OnChannelJoinSuccess;每當(dāng)遠(yuǎn)程流加入頻道時,就會調(diào)用 OnUserJoined;每當(dāng)遠(yuǎn)端流離開頻道時,就會調(diào)用 OnUserOffline。
在調(diào)用 JoinChannel 之后,我們在 OnJoinButtonClicked 中向 SceneManager 的 SceneLoaded 監(jiān)聽器添加一個回調(diào),然后將函數(shù)命名為 OnSceneFinishedLoading。由于每次加載場景時都會調(diào)用回調(diào),因此我們需要一個中間函數(shù)。
在設(shè)備上測試我們的工作成果之前,我們需要為 Android 添加一些權(quán)限請求。從 Unity 2018_3 開始,權(quán)限不再自動添加,因此我們需要添加一些 if-else 語句來檢查并請求麥克風(fēng)和攝像頭的權(quán)限。
在設(shè)備上構(gòu)建和測試
終于可以測試我們的應(yīng)用了!讓我們回到 Unity 并打開“Build Settings”。首先,我們將 WelcomeScene 和 ChatScene 拖到“Build Settings”對話框的 Scene 列表中。
在構(gòu)建和部署我們的應(yīng)用之前,我們需要對每個平臺的播放器設(shè)置進(jìn)行一些調(diào)整。我們需要更新 Bundle ID,并提供一些有關(guān)攝像頭和麥克風(fēng)使用情況的描述文本(啟用權(quán)限提示)。
現(xiàn)在我們準(zhǔn)備構(gòu)建我們的應(yīng)用!在“BuildSettings ”對話框中,單擊“Build ”按鈕,Unity 將提示你輸入保存構(gòu)建的位置。Unity 完成構(gòu)建 iOS 應(yīng)用后,將出現(xiàn)包含 Unity-iPhone.xcodeproj的Finder 窗口,雙擊該文件打開 XCode。打開 XCode后,選擇項目(從左側(cè)的文件導(dǎo)航器中),啟用“AutomaticSigning ”并選擇你的簽名證書。最后,確保已連接測試設(shè)備,然后單擊“播放”按鈕。
同樣的,我們這個版本也支持 Windows 和 macOS,如圖所示:
你可以看到 WelcomeScene 先被加載,當(dāng)我們加入頻道時,我們進(jìn)入 ChatScene,而當(dāng)我們單擊“Leave ”按鈕時,將返回 WelcomeScene。唯一缺少的是遠(yuǎn)程流,為了實現(xiàn)遠(yuǎn)端視頻流,我們需要第二個設(shè)備。
此外,我們也支持 Android。從“Platform ”列表中選擇“Android”,打開“Player Settings”并提供一個 Package Name。確保已連接你的 Android 設(shè)備,然后單擊“BuildAnd Run”。
搞定!
給你點贊,又搞定一個“小目標(biāo)”!如果你有任何新的想法,或遇到什么問題,歡迎點擊「閱讀原文」到 RTC 開發(fā)者社區(qū)與我們交流。
其它資源
我們在 Github 開源了 Unity SDK 的相關(guān)代碼示例,具體可以參考:https://github.com/AgoraIO/Agora-Unity-Quickstart/tree/master/video/Hello-Video-Unity-Agora
可在Unity Asset Store上獲取Agora.io Video SDK for Unity
完整的 API 文檔可在聲網(wǎng)文檔中心找到:https://docs.agora.io/cn/Video/release_unity_video?platform=Unity
如果在集成中遇到問題, 你可以到 RTC 開發(fā)者社區(qū)提問
備注
你可能會問,為什么是 getEngine() 而不是新的 IRtcEngine(),這與 Agora mRtcEngine 作為單例運(yùn)行有關(guān)。getEngine() 將檢查實例是否存在,如果不存在,則創(chuàng)建一個新實例。getEngine() 函數(shù)也可以稍后被調(diào)用以從代碼的其他部分獲取對引擎的引用。
所有回調(diào)在AgoraGameRtcEngine.cs中可見(Assets → /Scripts → /AgoraGamingSDK)。
注意:每個回調(diào)函數(shù)都會傳遞一組特定的參數(shù),因此,如果你打算添加其他任何回調(diào),請務(wù)必查看 AgoraGameRtcEngine.cs 文件
如果在開發(fā)過程中遇到任何技術(shù)問題,可以在Agora版塊中提問,聲網(wǎng)Agora工程師會及時回復(fù)。