如何基于 Blueprint 在游戲中創(chuàng)建實(shí)時(shí)音視頻功能
近日,Epic 公布了他們?yōu)榇螘r(shí)代游戲準(zhǔn)備的 Unreal 5 游戲引擎,以及一份效果驚艷的 Demo。據(jù)稱,游戲中的每個(gè)資源有一百萬(wàn)個(gè)繪制三角面,每一幀有超過(guò)十億個(gè)繪制三角面。也就是說(shuō),開發(fā)者構(gòu)建的游戲場(chǎng)景,能獲得電影特效場(chǎng)景般的視覺體驗(yàn)。
事實(shí)上,聲網(wǎng)也有許多采用 Unreal 的開發(fā)者。為了能讓開發(fā)者可以在游戲中快速實(shí)現(xiàn)實(shí)時(shí)音視頻對(duì)話,聲網(wǎng) Agora Unreal SDK Beta 版也已上線。
由于 Unreal 為開發(fā)者提供了兩種開發(fā)方式,一種是 Blueprint,即可視化編程,另一種是基于 C++開發(fā)。所以 Agora Unreal SDK 也提供了兩個(gè)版本—— Blueprint 和 C++,兩個(gè)版本均已上傳至 Agora Community 的 Github :
Blueprint版本:https://github.com/AgoraIO-Community/Agora-Unreal-SDK-Blueprint
C++版本:https://github.com/AgoraIO-Community/Agora-Unreal-SDK-CPP
大家可以在 Github 中 fork,并集成到 Unreal 項(xiàng)目中。如果遇到問題可在 Github 提 issue ,或在 RTC 開發(fā)者社區(qū)發(fā)帖 的反饋。
可以實(shí)現(xiàn)什么場(chǎng)景呢?
許多 3A 游戲大作都是基于 Unreal 引擎開發(fā)的,比如堡壘之夜、戰(zhàn)爭(zhēng)機(jī)器、火箭聯(lián)盟等。在一些游戲中,隊(duì)友之間需要通過(guò)語(yǔ)音交流配合。而這種游戲中的實(shí)時(shí)語(yǔ)音對(duì)話,就可以通過(guò) Agora Unreal SDK 來(lái)快速實(shí)現(xiàn)。
在類似于吃雞的游戲中,玩家不僅要能聽到隊(duì)友的語(yǔ)音,還要能憑借聲音來(lái)辨別隊(duì)友所在的方位。聲網(wǎng)Agora SDK 就支持該功能,它可以將玩家與其在聲場(chǎng)中的位置和方向?qū)?yīng),來(lái)提供聽聲辨位的能力。
Agora SDK 優(yōu)勢(shì)
超低延時(shí)
游戲中的語(yǔ)音對(duì)話要求實(shí)時(shí)音視頻技術(shù)的延時(shí)要小于400甚至300毫秒以內(nèi),玩家之間才能達(dá)到無(wú)障礙溝通的效果。聲網(wǎng)提供的軟件定義實(shí)時(shí)網(wǎng)SD-RTN™擁有超低延時(shí)特性,可做到全球端到端延時(shí)小于400ms,延時(shí)中位數(shù)76ms,處于行業(yè)領(lǐng)先水平。
抗弱網(wǎng)
不論是在 4G 或者 Wi-Fi 網(wǎng)絡(luò)情況下,玩家隨時(shí)會(huì)面臨比較復(fù)雜的網(wǎng)絡(luò)情況。而且,在弱網(wǎng)、非常高丟包情況下,要保證能進(jìn)行良好的音視頻互動(dòng)。聲網(wǎng)具備優(yōu)秀的弱網(wǎng)傳輸和抗丟包算法,可以在 60% 的丟包環(huán)境下保障音視頻流暢,70% 的網(wǎng)絡(luò)丟包環(huán)境下保障語(yǔ)音的流暢。
易于集成
還有一點(diǎn)非常重要的,就是需要將實(shí)時(shí)音視頻與游戲進(jìn)行簡(jiǎn)單、快速的結(jié)合。聲網(wǎng)的SDK非常簡(jiǎn)單易用,一個(gè)音視頻通話或直播應(yīng)用,只需要幾行代碼,30分鐘就能輕松搞定。
那么如何實(shí)現(xiàn)呢?我們?cè)诒疚南葋?lái)講講如何在 Unreal 中用 Blueprint 快速實(shí)現(xiàn)。稍后會(huì)分享基于 C++的實(shí)現(xiàn)步驟。
Agora Unreal SDK - Blueprint 實(shí)現(xiàn)
開發(fā)前的準(zhǔn)備
- Unreal 4.23 以上版本
- Visual Studio 或 Xcode(版本根據(jù) Unreal 配置要求而定)
- 運(yùn)行 Windows 7 以上系統(tǒng)的 PC 或 一臺(tái) Mac
- Agora 注冊(cè)賬號(hào)一枚(免費(fèi)注冊(cè),見官網(wǎng) Agora.io)
- 如果你的企業(yè)網(wǎng)絡(luò)存在防火墻,請(qǐng)?jiān)诼暰W(wǎng)文檔中心搜索「應(yīng)用企業(yè)防火墻限制」,進(jìn)行配置。
新建項(xiàng)目
首先我們要?jiǎng)?chuàng)建一個(gè) Unreal 項(xiàng)目,然后將 Agora SDK 集成到項(xiàng)目中。
現(xiàn)在,讓我們先從草圖開始,創(chuàng)建一個(gè)項(xiàng)目。如果已經(jīng)創(chuàng)建了項(xiàng)目,那么可以直接跳過(guò)這一步。
1.打開 Unreal Engine Editor,選擇 New project。
2.在新項(xiàng)目面板上,在項(xiàng)目類型中選擇 C++,然后給項(xiàng)目起個(gè)名,選擇項(xiàng)目保存路徑,完成創(chuàng)建。
3.確保在[your_project]/Source/[project_name]/[project_name].Build.cs文件的PrivateDependencyModuleNames一行,去掉注釋。Unreal 默認(rèn)是將它注釋掉的,這會(huì)導(dǎo)致在編譯的時(shí)候報(bào)錯(cuò)。
// Uncomment if you are using Slate UI PrivateDependencyModuleNames.AddRange(new string[] { "UMG", "Slate", "SlateCore" });
集成Agora SDK
接下來(lái)我們?cè)陧?xiàng)目中集成 Agora SDK
1.將 SDK 復(fù)制到這個(gè)路徑下 [your_project]/Plugins
2.把插件依賴添加到:
[your_project]/Source/[project_name]/[project_name].Build.cs 文件
的私有依賴(Private Dependencies)部分
PrivateDependencyModuleNames.AddRange(new string[] { "AgoraPlugin", "AgoraBlueprintable" });
3.重啟 Unreal
4.點(diǎn)擊 Edit->Plugin,在分類中找到 Project->Other,確定插件已經(jīng)生效
創(chuàng)建游戲?qū)嵗?/strong>
在項(xiàng)目的 Content 界面中,點(diǎn)擊右鍵,選擇 Blueprint Class
在All Classes中輸入“Game Instance”并選擇 Game Instance
把新的 Game Instance 命名為“AgoraGameInstance_BP”
由于Game Instance會(huì)在其它類之前進(jìn)行初始化,所以我們要先創(chuàng)建 AgoraGameIntance。雙擊進(jìn)入 AgoraGameInstance_BP 的 Blueprint,在Blueprint的工作區(qū)域點(diǎn)擊右鍵會(huì)顯示出菜單,輸入“Event Init”,并選擇它。
拖拽出 Event Init,點(diǎn)擊輸出接口后,輸入“Construct”,選擇Construct Object from Class function。
在 Class 的下拉菜單中選擇 Agora,然后將 Outer 的設(shè)定為從 Self 獲取參數(shù)。
通過(guò)拖拽,將 Construct Agora 輸出 Return Value 引腳設(shè)定為 Promote to variable。把新的變量名設(shè)定為“Agora”,點(diǎn)擊“????”圖標(biāo),把它設(shè)定為 public。
“Agora”的輸出,我們找到并選定為“Initialize”
創(chuàng)建 Game Mode(游戲模式)
Game Mode 將被用于切換 widgets。就像創(chuàng)建 Game Instance 一樣,在 Blueprint 中創(chuàng)建新的 Game Mode:
命名為“GameMode_BP”
創(chuàng)建 Widgets(控件)
在項(xiàng)目的 Content 中創(chuàng)建新的目錄 Widgets_BP。在這個(gè)目錄下添加兩個(gè) Widgets:右鍵點(diǎn)擊目錄內(nèi)容,然后選擇 User Interface -> Widget Blueprint:
將它們分別命名為“IntroductionWidget_BP”和“VideoCallWidget_BP”
Game Mode
回到 GameMode_BP,點(diǎn)擊“+”添加兩個(gè) function,并分別命名為“SetInctoductionView”和“SetVideoCallView”。
添加兩個(gè)變量,“IntroductionWidget_BP”和“VideoCallWidget_BP”,把他們的類型分別改為 Introduction Widget BP 和 Video Call Widget BP。
然后如下圖所示來(lái)設(shè)置
Introduction Widget(介紹控件)
進(jìn)入 InctoductionWidget_BP,創(chuàng)建控件的界面,就像圖中所示的:
在EncriptionTypeComboBox中添加以下變量:
回到繪制模式中,找到 Event Construct 并執(zhí)行,如圖所示:
InctoductionWidget_BP 會(huì)從 AgoraGameInstance_BP 獲得對(duì)象 Agora,在控件底部的 Text Block 中設(shè)定 Agora SDK 版本?;氐皆O(shè)計(jì)界面,選擇 Join 按鈕,在右側(cè)的 Event 中添加 On Clicked 事件
像圖中一樣,來(lái)設(shè)定事件執(zhí)行邏輯:
Video Call Widgets(視頻通話控件)
在 Demo 中找到 Content/ButtonTextures 目錄(你不用打開這個(gè)項(xiàng)目,只需要在文件中找到它就行)。所有的按鈕 texture 都保存在這里。在你項(xiàng)目的 content 中創(chuàng)建一個(gè)新的目錄“ButtonTextures”,把這里所有的 texture 都拖拽放到里面。
進(jìn)入 VideoCallLevel_BP,創(chuàng)建 widget 界面:
打開可視化視圖,增加 isLocalAudioMuted、isLocalVideoMute 布爾變量,(Graph),增加 CurrentUserId 64 位整數(shù)變量。添加功能與執(zhí)行邏輯如下圖所示:
進(jìn)入 Event Graph,然后按照以下步驟執(zhí)行
創(chuàng)建新的 Level
進(jìn)入 project Content,創(chuàng)建 Level 目錄(如果之前沒有創(chuàng)建)。右鍵單擊目錄,選擇新 Level:
將 Level 重命名為“VideoCallLevel_BP”
選擇這個(gè) Leve,點(diǎn)擊頂部的 Blueprint 圖標(biāo),選擇 Open Level Blueprint 選項(xiàng):
如圖中所示執(zhí)行Event Begin Play
修改 World 與項(xiàng)目設(shè)置
進(jìn)入 Window->World設(shè)置,把 GameMode 設(shè)為 GameMode_BP。
進(jìn)入 Edit->Project設(shè)置,選擇 Map&Modes,按照下圖所示設(shè)定值。
好了,現(xiàn)在可以運(yùn)行游戲了
下周我們將分享基于 Unreal C++ 與 Agora Unreal SDK 如何實(shí)現(xiàn)游戲中的實(shí)時(shí)音視頻。
同時(shí),我們還想邀請(qǐng)?bào)w驗(yàn) Agora Unreal SDK Beta 版的開發(fā)者們填寫一個(gè)有獎(jiǎng)問卷,希望大家可以深度參與SDK 的功能規(guī)劃。
總結(jié)
到此這篇關(guān)于Unreal 5 公布的同時(shí)Agora Unreal SDK 也已為你準(zhǔn)備好了的文章就介紹到這了,更多相關(guān)Unreal 5 Agora Unreal SDK 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C++11實(shí)現(xiàn)手寫線程池的示例代碼
在實(shí)際的項(xiàng)目中,使用線程池是非常廣泛的,本文主要介紹了基于C++11實(shí)現(xiàn)手寫線程池的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08C++的template模板中class與typename關(guān)鍵字的區(qū)別分析
這篇文章中我們來(lái)談一談C++的template模板中class與typename關(guān)鍵字的區(qū)別分析,同時(shí)會(huì)講到嵌套從屬名稱時(shí)的一些注意點(diǎn),需要的朋友可以參考下2016-06-06C語(yǔ)言 用while循環(huán)求和的平均值操作
這篇文章主要介紹了C語(yǔ)言 用while循環(huán)求和的平均值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12C++調(diào)用matlab函數(shù)的實(shí)例
這篇文章主要介紹了C++調(diào)用matlab函數(shù)的方法,包括封裝matlab函數(shù),編譯matlab函數(shù)及C++環(huán)境配置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08c++使用Easyx圖形庫(kù)實(shí)現(xiàn)飛機(jī)大戰(zhàn)
本文詳細(xì)講解了c++使用Easyx圖形庫(kù)實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12C語(yǔ)言數(shù)據(jù)在內(nèi)存中的存儲(chǔ)流程深入分析
使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-10-10C/C++內(nèi)存管理之new與delete的使用及原理解析
這篇文章主要介紹了C/C++內(nèi)存管理之new與delete的使用及原理解析,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08