REST API來源:https://en.wikipedia.org/wiki/Representational_state_transfer

總的說來,要使用REST API,就需要向服務(wù)器發(fā)出HTTP請求,服務(wù)器會按已知的格式給我們返回答案,比如JSON或XML。

虛幻引擎擁有兩個非常實用的插件:

Http Blueprint – 向服務(wù)器發(fā)送HTTP。

JSON Blueprint Utilities – 解析和解碼JSON對象。

這些插件在C++和藍(lán)圖中公開了它們的功能,不用編寫代碼就可以查詢這些API!

初始設(shè)置

設(shè)置谷歌云(Google Cloud)服務(wù)

要使用REST API,通常需要個人API密鑰(Personal API Key)。

這個密鑰會識別請求的來源,以便在出現(xiàn)與服務(wù)相關(guān)的費用時,根據(jù)你的使用情況收取費用。

使用這些服務(wù)必須有谷歌地圖API密鑰。參閱此處了解關(guān)于密鑰創(chuàng)建的更多信息。

對本實驗而言,我們在項目密鑰(Project Key)中添加了以下API:

發(fā)送請求時要小心,因為有可能產(chǎn)生相關(guān)成本。請避免在循環(huán)中發(fā)送請求,因為這樣有可能超過每秒查詢數(shù)的限制,還有可能造成成本浪費。為此,設(shè)置API密鑰限制和使用警報非常重要。

創(chuàng)建虛幻項目

新建一個虛幻引擎5.1項目,在模擬類別(Simulation Category)中選擇空白項目模板,僅使用藍(lán)圖。

打開編輯器之后,啟用以下插件

在模擬模板中啟用SunSky和GeoReferencing插件。
然后,你要將Photorealistic 3D Tiles添加到關(guān)卡中。

Cesium在本教程中記錄了該過程。遵循其中描述的步驟,但是有以下例外情形:

確保為以下內(nèi)容設(shè)置相同的地理參考點:

這一步是必須要做的,因為三個插件各自獨立運行,我們不想在它們之間創(chuàng)建依賴關(guān)系。

確保所有地理參考對象都同步

玩家出生點在巴黎凱旋門附近

下面我們就來使用API

創(chuàng)建需要的資產(chǎn)

設(shè)置基本游戲?qū)ο?/strong>

確保:

設(shè)計顧慮

在這個演示項目中,我們實現(xiàn)了3個主要功能

3個主要功能
為了實現(xiàn)這些功能,我們創(chuàng)建了以下對象:

使用REST API要注意的主要問題是,發(fā)送請求是一個非阻塞調(diào)用。調(diào)用者將在之后收到請求結(jié)果,我們不希望在等待請求結(jié)果的過程中阻塞程序。因此,我們將使用大量的異步編程模式,利用事件分發(fā)器。

自定義事件VS函數(shù)

在使用Http發(fā)布請求節(jié)點(Http Post Request Node)發(fā)布請求時,你可以在右上角看到一個小時鐘。這意味著該節(jié)點將執(zhí)行異步調(diào)用。事件圖表將在這里暫停執(zhí)行(除非在請求處理(Request Processing)引腳連接其他內(nèi)容)。收到結(jié)果后,它將通過“請求成功(Request Was Successful)”或“請求不成功(Request Was Not Successful)”執(zhí)行引腳恢復(fù)執(zhí)行。

發(fā)布請求是一個異步調(diào)用!

這會帶來了一個重要的設(shè)計約束。函數(shù)中不能包含任何帶異步調(diào)用的藍(lán)圖節(jié)點。只能在事件圖表中使用。因此,你必須在一個事件圖表中、在一個自定義事件中發(fā)送請求。

但是如果在事件圖表中實現(xiàn)所有內(nèi)容,整個圖表很快就會變得非常混亂。因此,我們?nèi)匀皇褂煤瘮?shù)將同步操作(例如構(gòu)建請求和處理應(yīng)答)組合在一起,然后將這些調(diào)用堆疊在自定義事件下。

誰知道誰?在對象之間創(chuàng)建引用的正確方法!

另一種常見的重大設(shè)計缺陷在于用戶界面和底層對象的綁定方式。

在應(yīng)用程序編程中,我們有不同的設(shè)計模式,包括文檔/視圖、模型-視圖-控制器(MVC)、模型-視圖-視圖模型(MVVM)。

無需輸入太多細(xì)節(jié),表示層(UI)知道它所顯示的對象,但對象本身必須對表示層不可知。

從數(shù)據(jù)對象(如BP_PlacesAPI_Helper對象)調(diào)用控件更新是非法的!

建議讓BP_PlacesAPI_Helper在數(shù)據(jù)可用或發(fā)生更改時觸發(fā)事件。因此,我們要創(chuàng)建“事件分發(fā)器”,其他應(yīng)用程序?qū)ο螅热鏤MG控件或玩家控制器將訂閱事件分發(fā)器!

所有可能的請求都將遵循類似下面的模式:

請求的剖析

注意,搜索附近地點功能有一個小技巧:為了限制服務(wù)器的負(fù)載,請求只返回前20個結(jié)果。

要想獲取更多結(jié)果,需要重新發(fā)起相同的查詢,但這次有一個特殊選項,就是和第一個查詢結(jié)果一起收到的token。這樣就可以得到后續(xù)的20個地點,以及再往后的20個地點,最多60個地點。

為了處理這種特殊情況,我們有兩個針對附近地點的事件,一個用于獲取前20個地點,另一個用于獲取后續(xù)的20個地點。

聚焦BP_PlacesAPI_Helper Actor

根據(jù)上面闡述的設(shè)計,BP_PlacesAPI_Helper將包含下列成員:

BP_PlacesAPI_Helper函數(shù)

BP_PlacesAPI_Helper變量和事件分發(fā)器

格式化請求

API文檔中有關(guān)于格式化請求的解釋。

例如,從地點自動完成API(Places Autocomplete API)文檔中,我們了解到URL必須按這種方式格式化,可能的其他輸入?yún)?shù)要用“?m=value”隔開。

URL格式

URL示例

大多數(shù)時候,我們只是附加字符串,最后是我們的API密鑰。

查找海拔請求

發(fā)送請求

Post Request需要一個URL和說明這是一個JSON請求的請求頭。

如果需要添加其他可選參數(shù),可以提供一個可選的請求體。

注意,我們?yōu)閷嶋H請求發(fā)送統(tǒng)計添加了計數(shù)器,用于監(jiān)控實際發(fā)送的請求數(shù)量。

發(fā)送請求(注意異步調(diào)用)

處理結(jié)果

處理結(jié)果是整個過程中最枯燥的部分。

你將收到一個采用通用編碼方式編碼的JSON對象。

你可以請求一個字段值,你將得到:

所有這些情況都由“獲取字段(Get Field)”藍(lán)圖節(jié)點處理。

你要知道結(jié)果的格式,以便處理結(jié)果。好在它會被記錄下來。

專業(yè)意見:在嘗試迭代解析之前,最好先在瀏覽器中輸入請求URL來運行查詢。如果JSON對象以字符串形式返回,會難以讀取。

但是有些在線JSON查看器,比如這個,你可以將這個字符串粘貼到這個查看器中,它會創(chuàng)建一個更容易讀取的節(jié)點層級!

原始JSON響應(yīng)字符串

在線查看器中顯示的相同JSON字符串

這種表示方式更便于在層級結(jié)構(gòu)中導(dǎo)航,也更容易了解獲取字段節(jié)點是需要返回一個字符串,還是另一個JSON對象或一個JSON對象數(shù)組。

在創(chuàng)建獲取字段節(jié)點時,數(shù)值(Value)引腳默認(rèn)顯示灰色。它會根據(jù)你連接的引腳發(fā)生改變。因此,在連接引腳之前,必須先創(chuàng)建包含目標(biāo)引腳的節(jié)點。

始終將數(shù)值引腳從目標(biāo)綁定到源,以獲得正確的類型!

由于JSON的結(jié)構(gòu)一目了然,并且知道獲取字段的規(guī)則,解碼響應(yīng)就變得非常簡單,比如下面的“查找地點自動完成(Find Place Autocomplete)”。

注意,在生產(chǎn)中,建議在處理過程中采用更好的錯誤處理流程。

JSON文件處理示例

處理過程的最后一步是將結(jié)果通知給感興趣的對象。

我們事先不知道誰會對結(jié)果感興趣。可能是顯示地點細(xì)節(jié)的UI,然后由玩家控制器決定是否讓Pawn飛到這個位置。

為此,我們添加了一個事件分發(fā)器,其中可能包含將隨事件傳遞的輸入,訂閱該事件的其他對象將接收該輸入。

在BP_PlacesAPI_Helper中,我們在處理完結(jié)果之后觸發(fā)事件分發(fā)器

在UMG控件中,我們訂閱了這個事件,并相應(yīng)地重新構(gòu)建了建議列表。

用戶界面

除了ListView系統(tǒng)之外,UMG控件并沒有什么特別之處。

在UMG中,使用控件填充垂直框是一個非常常見的操作。但是根據(jù)元素的數(shù)量,具體過程可能比較復(fù)雜或者比較緩慢。ListView是一個虛擬視圖,可以幫助我們處理列表中的大量對象,具有很大的靈活性。

為了整理這個列表,我們需要:

行控件(Row Widget)需要實現(xiàn)“用戶對象列表條目”接口。

需要實現(xiàn)“列表項目對象集上”事件。

然后,在主控件上添加一個列表視圖控件(ListView Widget),將條目控件類(Entry Widget Class)設(shè)為剛才創(chuàng)建的類。每當(dāng)向列表中添加一個項目,就會創(chuàng)建相應(yīng)的行控件,顯示底層對象。

將點擊項目(Item Clicked)事件綁定到一個自定義事件處理器上,這樣處理就結(jié)束了。

定義與每一行相關(guān)的控件類(Widget Class),綁定點擊項目事件。

事件處理器負(fù)責(zé)填充列表,對點擊做出響應(yīng)。

地理標(biāo)記及其管理器

地理標(biāo)記藍(lán)圖由一個簡單的縮放立方體、一個用于顯示大頭釘?shù)淖园l(fā)光材質(zhì)和一個2D文本控件構(gòu)成。

大頭釘稍微有點特殊,我們將根據(jù)距離對它進行縮放,以呈現(xiàn)單像素線條的效果。

在我們的例子中,如果使用3D瓦片,在下載瓦片時,幾何體將隨著時間的推移不斷改進。為了確保始終正確對齊,2s定時器會將控件重新放在地平面上。

按距離縮放大頭釘網(wǎng)格體

限制在地平面上(使用海拔高度偏移)

確保控件組件(Widget Component)使用你的自定義控件,

并在“屏幕”模式下按“期望的大小”呈現(xiàn)。

為了實現(xiàn)交互性,2D控件包含一個帶鼠標(biāo)鍵按下綁定的換行邊界,

它會發(fā)送一個“Clicked”事件分發(fā)器。(可以是一個透明的按鈕)

在處理多個這樣的對象時,一種明智的做法是創(chuàng)建一個專門的對象來管理這些對象。在這種情況下,標(biāo)記管理器(Marker Manager)非常簡單,它只處理一組標(biāo)記類型,但可以發(fā)展到處理不同的標(biāo)記層,帶可見性開關(guān)……

創(chuàng)建一個BP_MarkerManager Actor,一個生成地理標(biāo)記(SpawnGeoMarkers)事件。在這個事件中,我們要:

刪除標(biāo)記時,一定要取消綁定事件“Clicked”!

生成標(biāo)記1/2

生成標(biāo)記2/2

樣式

在啟動這樣的應(yīng)用程序時,我們事先不知道會給標(biāo)記使用哪種顏色(Colors)或圖標(biāo)(Icons)。隨著時間的推移,我們可能還會添加其他類型的標(biāo)記。如果開始對這些值進行硬編碼,之后的編輯過程將會十分痛苦。

要解決這個問題,數(shù)據(jù)表是一個非常好的選擇。

基于樣式內(nèi)容構(gòu)建數(shù)據(jù)表

玩家控制器處理高級邏輯

現(xiàn)在,MarkerManager和PlaceAPI Helper可以在事情發(fā)生時發(fā)送事件,接下來我們要處理邏輯。

這是在玩家控制器中完成的,它會生成UI并獲取對MarkerManager和PlaceAPI Helper的引用。

綁定地點相關(guān)事件

綁定標(biāo)記相關(guān)事件

總結(jié)

通過Http藍(lán)圖和JSON藍(lán)圖實用程序,在虛幻引擎中使用Web API變得越來越容易。

借助這些模塊,所有人都可以使用這些API,不需要編寫代碼。

由于請求的異步性,采用事件驅(qū)動型設(shè)計非常重要,但是通過事件分發(fā)器和將回調(diào)綁定到這些事件上,一切就簡單多了。

這個簡短的概念驗證過程是在一天內(nèi)完成的,還有很多地方需要改進。但我們的目標(biāo)是說明查詢外部服務(wù)其實非常容易,而這也是數(shù)字孿生應(yīng)用程序的關(guān)鍵一環(huán)!

希望大家喜歡!

文章轉(zhuǎn)自微信公眾號@虛幻引擎

#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費