REST API來源:https://en.wikipedia.org/wiki/Representational_state_transfer
總的說來,要使用REST API,就需要向服務器發出HTTP請求,服務器會按已知的格式給我們返回答案,比如JSON或XML。
虛幻引擎擁有兩個非常實用的插件:
Http Blueprint – 向服務器發送HTTP。
JSON Blueprint Utilities – 解析和解碼JSON對象。
這些插件在C++和藍圖中公開了它們的功能,不用編寫代碼就可以查詢這些API!
初始設置
設置谷歌云(Google Cloud)服務
要使用REST API,通常需要個人API密鑰(Personal API Key)。
這個密鑰會識別請求的來源,以便在出現與服務相關的費用時,根據你的使用情況收取費用。
使用這些服務必須有谷歌地圖 API密鑰。參閱此處了解關于密鑰創建的更多信息。
對本實驗而言,我們在項目密鑰(Project Key)中添加了以下API:
地圖瓦片API(Map Tile API) – 使用Cesium for Unreal插件加載3D瓦片內容
地圖地點API(Maps Places API) – 查詢地點信息
地圖海拔API(Maps Elevation API) – 了解某一位置的海拔數據
發送請求時要小心,因為有可能產生相關成本。請避免在循環中發送請求,因為這樣有可能超過每秒查詢數的限制,還有可能造成成本浪費。為此,設置API密鑰限制和使用警報非常重要。
創建虛幻項目
新建一個虛幻引擎5.1項目,在模擬類別(Simulation Category)中選擇空白項目模板,僅使用藍圖。
打開編輯器之后,啟用以下插件
Cesium for Unreal(可從虛幻商城獲取)。
Http Blueprint(它會自動向Json Blueprint Utilities添加一個依賴項)
在模擬模板中啟用SunSky和GeoReferencing插件。 然后,你要將Photorealistic 3D Tiles添加到關卡中。
Cesium在本教程中記錄了該過程。遵循其中描述的步驟,但是有以下例外情形:
不需要使用Cesium Sunky,模擬模板已經設置好虛幻引擎SunSky。
不要使用Cesium動態Pawn(Cesium Dynamic Pawn)。我們使用GeoReferencing插件提供的BP_RoundPlanetPawn。
確保為以下內容設置相同的地理參考點:
Cesium地理參考(Cesium Georeference)
虛幻引擎地理參考系統(UE Georeferencing System)
SunSky
這一步是必須要做的,因為三個插件各自獨立運行,我們不想在它們之間創建依賴關系。
確保所有地理參考對象都同步
玩家出生點在巴黎凱旋門附近
下面我們就來使用API
創建需要的資產
設置基本游戲對象
確保:
關卡中有一個玩家出生點
有可以使用的自定義游戲模式設置
你自己的玩家控制器(我們使用修改過的BP_SimPlayerController副本)
Georeferencing插件中有可用的BP_RoundPlanetPawn在項目設置中設置以下游戲模式和初始地圖。
設計顧慮
在這個演示項目中,我們實現了3個主要功能
自動完成位置搜索并飛到該位置
查詢附近的興趣點(餐館、酒吧),生成地理標記(GeoMarker)
點擊地理標記獲取詳細信息。
3個主要功能 為了實現這些功能,我們創建了以下對象:
BP_PlaceAPI_Helper:負責調用谷歌地圖API的藍圖Actor
BP_Place:存儲地點(位置)屬性的純藍圖數據對象
UMG_GeoQueries:主應用程序UMG控件
BP_GeoMarker:作為地點視覺表示的藍圖Actor
BP_MarkerManager:用于管理地理標記的藍圖Actor
使用REST API要注意的主要問題是,發送請求是一個非阻塞調用。調用者將在之后收到請求結果,我們不希望在等待請求結果的過程中阻塞程序。因此,我們將使用大量的異步編程模式,利用事件分發器。
自定義事件 VS 函數
在使用Http發布請求節點(Http Post Request Node)發布請求時,你可以在右上角看到一個小時鐘。這意味著該節點將執行異步調用。事件圖表將在這里暫停執行(除非在請求處理(Request Processing)引腳連接其他內容)。收到結果后,它將通過“請求成功(Request Was Successful)”或“請求不成功(Request Was Not Successful)”執行引腳恢復執行。
發布請求是一個異步調用!
這會帶來了一個重要的設計約束。函數中不能包含任何帶異步調用的藍圖節點。只能在事件圖表中使用。因此,你必須在一個事件圖表中、在一個自定義事件中發送請求。
但是如果在事件圖表中實現所有內容,整個圖表很快就會變得非常混亂。因此,我們仍然使用函數將同步操作(例如構建請求和處理應答)組合在一起,然后將這些調用堆疊在自定義事件下。
誰知道誰?在對象之間創建引用的正確方法!
另一種常見的重大設計缺陷在于用戶界面和底層對象的綁定方式。
在應用程序編程中,我們有不同的設計模式,包括文檔/視圖、模型-視圖-控制器(MVC)、模型-視圖-視圖模型(MVVM)。
無需輸入太多細節,表示層(UI)知道它所顯示的對象,但對象本身必須對表示層不可知。
從數據對象(如BP_PlacesAPI_Helper對象)調用控件更新是非法的!
建議讓BP_PlacesAPI_Helper在數據可用或發生更改時觸發事件。因此,我們要創建“事件分發器”,其他應用程序對象,比如UMG控件或玩家控制器將訂閱事件分發器!
所有可能的請求都將遵循類似下面的模式:
請求的剖析
注意,搜索附近地點功能有一個小技巧:為了限制服務器的負載,請求只返回前20個結果。
要想獲取更多結果,需要重新發起相同的查詢,但這次有一個特殊選項,就是和第一個查詢結果一起收到的token。這樣就可以得到后續的20個地點,以及再往后的20個地點,最多60個地點。
為了處理這種特殊情況,我們有兩個針對附近地點的事件,一個用于獲取前20個地點,另一個用于獲取后續的20個地點。
聚焦BP_PlacesAPI_Helper Actor
根據上面闡述的設計,BP_PlacesAPI_Helper將包含下列成員:
自動完成地點尋找(Find Place Autocomplete)
In:部分地址,Out:預測的BP_Places數組
完成時,事件分發器“PredictedPlacesAvailable”
查詢地點詳情(Query Place Details)
In:BP_Place, GetAltitude(可選)。Out:更新輸入BP_Place
完成時,事件分發器“Place Details Received”
搜尋附近地點(Search Nearby Places)
In:類型字符串、半徑,Out:附近BP_Places數組
每當收到一批地點時,事件分發器“Nearby Places Received”
作為函數
格式化請求URL的函數
處理JSON結果的函數
效用函數
凈化URL(用%20替換空格,用%2C替換逗號)
檢查JSON響應中的錯誤
BP_PlacesAPI_Helper函數
BP_PlacesAPI_Helper變量和事件分發器
格式化請求
API文檔中有關于格式化請求的解釋。
例如,從地點自動完成API(Places Autocomplete API)文檔中,我們了解到URL必須按這種方式格式化,可能的其他輸入參數要用“?m=value”隔開。
URL格式
URL示例
大多數時候,我們只是附加字符串,最后是我們的API密鑰。
查找海拔請求
發送請求
Post Request需要一個URL和說明這是一個JSON請求的請求頭。
如果需要添加其他可選參數,可以提供一個可選的請求體。
注意,我們為實際請求發送統計添加了計數器,用于監控實際發送的請求數量。
發送請求(注意異步調用)
處理結果
處理結果是整個過程中最枯燥的部分。
你將收到一個采用通用編碼方式編碼的JSON對象。
你可以請求一個字段值,你將得到:
一個帶值的字符串,如果是“葉節點(Leaf Node)”。
又一個JSON對象,如果是“子節點(Child Node)”。
其他JSON對象的數組,在循環中處理。
所有這些情況都由“獲取字段(Get Field)”藍圖節點處理。
你要知道結果的格式,以便處理結果。好在它會被記錄下來。
專業意見:在嘗試迭代解析之前,最好先在瀏覽器中輸入請求URL來運行查詢。如果JSON對象以字符串形式返回,會難以讀取。
但是有些在線JSON查看器,比如這個,你可以將這個字符串粘貼到這個查看器中,它會創建一個更容易讀取的節點層級!
原始JSON響應字符串
在線查看器中顯示的相同JSON字符串
這種表示方式更便于在層級結構中導航,也更容易了解獲取字段節點是需要返回一個字符串,還是另一個JSON對象或一個JSON對象數組。
在創建獲取字段節點時,數值(Value)引腳默認顯示灰色。它會根據你連接的引腳發生改變。因此,在連接引腳之前,必須先創建包含目標引腳的節點。
始終將數值引腳從目標綁定到源,以獲得正確的類型!
由于JSON的結構一目了然,并且知道獲取字段的規則,解碼響應就變得非常簡單,比如下面的“查找地點自動完成(Find Place Autocomplete)”。
注意,在生產中,建議在處理過程中采用更好的錯誤處理流程。
JSON文件處理示例
處理過程的最后一步是將結果通知給感興趣的對象。
我們事先不知道誰會對結果感興趣。可能是顯示地點細節的UI,然后由玩家控制器決定是否讓Pawn飛到這個位置。
為此,我們添加了一個事件分發器,其中可能包含將隨事件傳遞的輸入,訂閱該事件的其他對象將接收該輸入。
在BP_PlacesAPI_Helper中,我們在處理完結果之后觸發事件分發器
在UMG控件中,我們訂閱了這個事件,并相應地重新構建了建議列表。
用戶界面
除了ListView系統之外,UMG控件并沒有什么特別之處。
在UMG中,使用控件填充垂直框是一個非常常見的操作。但是根據元素的數量,具體過程可能比較復雜或者比較緩慢。ListView是一個虛擬視圖,可以幫助我們處理列表中的大量對象,具有很大的靈活性。
為列表的每一行創建一個特殊控件。
ListView將專門用于這個控件。
在向列表中添加元素時,該元素會被傳輸到行控件用于顯示。
為了整理這個列表,我們需要:
創建一個UMG用戶控件(UMG User Widget)作為行控件。(這里是UMG_PlaceWidgetEntry)
在本POC中只是個簡單的文本框,但它可以包含一個圖標。
在“圖表(Graph)”面板中,點擊“類設置(Class Settings)”,在細節面板中找到“接口(Interfaces)”類別,將“用戶對象列表條目(User Object List Entry)”添加到已實現接口列表中。
右鍵單擊“列表項目對象集上(OnListItemObjectSet)”,選擇實現事件。
在藍圖圖表中,將這個對象轉換為需要顯示的實際類型,然后用它的屬性來更新UI。
行控件(Row Widget)需要實現“用戶對象列表條目”接口。
需要實現“列表項目對象集上”事件。
然后,在主控件上添加一個列表視圖控件(ListView Widget),將條目控件類(Entry Widget Class)設為剛才創建的類。每當向列表中添加一個項目,就會創建相應的行控件,顯示底層對象。
將點擊項目(Item Clicked)事件綁定到一個自定義事件處理器上,這樣處理就結束了。
定義與每一行相關的控件類(Widget Class),綁定點擊項目事件。
事件處理器負責填充列表,對點擊做出響應。
地理標記及其管理器
地理標記藍圖由一個簡單的縮放立方體、一個用于顯示大頭釘的自發光材質和一個2D文本控件構成。
大頭釘稍微有點特殊,我們將根據距離對它進行縮放,以呈現單像素線條的效果。
在我們的例子中,如果使用3D瓦片,在下載瓦片時,幾何體將隨著時間的推移不斷改進。為了確保始終正確對齊,2s定時器會將控件重新放在地平面上。
按距離縮放大頭釘網格體
限制在地平面上(使用海拔高度偏移)
確保控件組件(Widget Component)使用你的自定義控件,
并在“屏幕”模式下按“期望的大小”呈現。
為了實現交互性,2D控件包含一個帶鼠標鍵按下綁定的換行邊界,
它會發送一個“Clicked”事件分發器。(可以是一個透明的按鈕)
在處理多個這樣的對象時,一種明智的做法是創建一個專門的對象來管理這些對象。在這種情況下,標記管理器(Marker Manager)非常簡單,它只處理一組標記類型,但可以發展到處理不同的標記層,帶可見性開關……
創建一個BP_MarkerManager Actor,一個生成地理標記(SpawnGeoMarkers)事件。在這個事件中,我們要:
移除所有現有標記,
獲取樣式信息(見下文)
計算變換(向上向量不是Z+,我們在圓形的地球上)
生成標記
設置屬性
綁定事件“Clicked”,該事件將發送標記與BP_Place
刪除標記時,一定要取消綁定事件“Clicked”!
生成標記1/2
生成標記2/2
樣式
在啟動這樣的應用程序時,我們事先不知道會給標記使用哪種顏色(Colors)或圖標(Icons)。隨著時間的推移,我們可能還會添加其他類型的標記。如果開始對這些值進行硬編碼,之后的編輯過程將會十分痛苦。
要解決這個問題,數據表是一個非常好的選擇。
利用顏色和圖標屬性創建一個簡單的S_MarkerStyle。
基于這一結構創建數據表,并為你希望提供支持的標記類型添加行。
將這個數據表設為BP_MarkerManager的屬性(Property)。
在生成標記時,管理器將使用這些數據來選擇樣式。通過這種方式,你可以逐漸改進自己的樣式,甚至為最終用戶提供不同的自定義樣式!
基于樣式內容構建數據表
玩家控制器處理高級邏輯
現在,MarkerManager和PlaceAPI Helper可以在事情發生時發送事件,接下來我們要處理邏輯。
這是在玩家控制器中完成的,它會生成UI并獲取對MarkerManager和PlaceAPI Helper的引用。
綁定地點相關事件
綁定標記相關事件
總結
通過Http藍圖和JSON藍圖實用程序,在虛幻引擎中使用Web API變得越來越容易。
借助這些模塊,所有人都可以使用這些API,不需要編寫代碼。
由于請求的異步性,采用事件驅動型設計非常重要,但是通過事件分發器和將回調綁定到這些事件上,一切就簡單多了。
這個簡短的概念驗證過程是在一天內完成的,還有很多地方需要改進。但我們的目標是說明查詢外部服務其實非常容易,而這也是數字孿生應用程序的關鍵一環!
希望大家喜歡!
文章轉自微信公眾號@虛幻引擎
熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
免費開始試用 →
3000+提示詞助力AI大模型
和專業工程師共享工作效率翻倍的秘密
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
91麻豆国产福利在线观看 |
成人午夜精品在线 |
亚洲午夜av在线 |
国产在线视频不卡二 |
91精品国产免费 |
麻豆91免费观看 |
日韩欧美国产不卡 |
美女尤物国产一区 |
日韩欧美中文字幕制服 |
久久国产精品99久久人人澡 |
91精品国产麻豆国产自产在线 |
午夜国产精品一区 |
欧美xfplay |
成人午夜视频免费看 |
中文字幕一区在线观看视频 |
97精品电影院 |
天天av天天翘天天综合网色鬼国产
|
国产精品国产精品国产专区不片 |
99在线精品免费 |
亚洲最快最全在线视频 |
日韩欧美在线综合网 |
国产aⅴ综合色 |
亚洲超丰满肉感bbw |
久久先锋影音av鲁色资源网 |
99久久国产免费看 |
久久成人av少妇免费 |
亚洲欧洲韩国日本视频 |
欧美一区二区三区视频免费
|
99国产精品视频免费观看 |
亚洲不卡在线观看 |
国产精品成人一区二区艾草 |
欧美一区二区三区白人 |
成人av网站免费 |
精彩视频一区二区三区 |
一区二区三区成人在线视频 |
欧美国产综合一区二区 |
欧美电影免费观看高清完整版在 |
色94色欧美sute亚洲线路一久
|
亚洲一区二区三区爽爽爽爽爽
|
jizzjizzjizz欧美 |
九九九精品视频 |
蜜桃av一区二区 |
天涯成人国产亚洲精品一区av |
国产精品黄色在线观看 |
国产欧美一区二区精品久导航 |
91精品国模一区二区三区 |
色视频欧美一区二区三区 |
成人免费看视频 |
成人av电影在线观看 |
国产精品99久久久久 |
国内精品写真在线观看 |
毛片不卡一区二区 |
韩国理伦片一区二区三区在线播放 |
午夜亚洲福利老司机 |
午夜激情综合网 |
青娱乐精品在线视频 |
亚洲高清在线精品 |
丝袜美腿亚洲一区二区图片 |
午夜成人免费视频 |
日韩av成人高清 |
激情成人综合网 |
国产二区国产一区在线观看 |
成人av网站免费观看 |
色欧美88888久久久久久影院 |
一本色道久久综合亚洲aⅴ蜜桃 |
色综合av在线 |
欧美一区二区三区视频在线 |
日韩精品一区二区三区四区视频 |
日韩你懂的在线观看 |
国产亚洲自拍一区 |
亚洲图片激情小说 |
日韩中文字幕亚洲一区二区va在线
|
精品电影一区二区 |
久久久久久免费网 |
国产精品成人在线观看 |
亚洲国产日韩一区二区 |
激情国产一区二区 |
在线观看亚洲a |
国产欧美精品一区 |
免费高清在线视频一区· |
国产99久久久精品 |
欧美肥妇bbw |
国产精品久久久久aaaa樱花
|
欧美一级在线免费 |
亚洲免费在线视频 |
国产乱子轮精品视频 |
色婷婷av一区二区三区之一色屋 |
日韩视频中午一区 |
亚洲综合视频在线 |
99精品欧美一区 |
精品国产91九色蝌蚪 |
一区二区激情小说 |
成人一区在线观看 |
欧美www视频 |
免费观看91视频大全 |
日本电影亚洲天堂一区 |
国产欧美精品一区二区色综合
|
91黄色免费观看 |
中文字幕亚洲精品在线观看 |
免费观看一级欧美片 |
日本高清不卡在线观看 |
国产精品国产自产拍在线 |
久久99精品久久久久久国产越南 |
欧美亚洲图片小说 |
伊人色综合久久天天 |
成人av在线网 |
中文字幕乱码久久午夜不卡 |
国产成人免费视频精品含羞草妖精 |
日韩一区二区影院 |
日韩国产高清在线 |
91精品国产全国免费观看 |
亚洲第一成人在线 |
欧美日韩亚洲综合在线 |
亚洲成va人在线观看 |
色婷婷综合久久久中文一区二区 |
最新热久久免费视频 |
成人h动漫精品 |
亚洲视频一区二区在线观看 |
成人午夜激情视频 |
亚洲男人的天堂在线观看 |
色偷偷一区二区三区 |
亚洲精品国产第一综合99久久
|
91论坛在线播放 |
亚洲成人精品一区 |
91精品国产综合久久国产大片 |
日韩av中文在线观看 |
欧美成人综合网站 |
成人av片在线观看 |
亚洲国产aⅴ天堂久久 |
欧美一区二区三区喷汁尤物 |
国产一区二区三区观看 |
综合久久久久久久 |
欧美日韩大陆在线 |
狠狠色狠狠色综合 |
亚洲精品国产一区二区精华液
|
亚洲女人小视频在线观看 |
欧美日韩一级视频 |
国产精品自拍一区 |
亚洲精品ww久久久久久p站
|
欧美美女喷水视频 |
大桥未久av一区二区三区中文 |
亚洲美女视频在线 |
337p日本欧洲亚洲大胆精品 |
91污片在线观看 |
韩国v欧美v亚洲v日本v |
亚洲精品国产品国语在线app |
欧美日韩高清在线 |
www.欧美精品一二区 |
欧美a级理论片 |
一区二区三区日韩欧美 |
久久久国产午夜精品 |
欧美在线一区二区 |
成人av网站在线 |
国产盗摄一区二区 |
蜜臀久久99精品久久久久久9 |
亚洲男人天堂av网 |
国产精品白丝在线 |
久久久久88色偷偷免费
|
欧美福利一区二区 |
欧美日韩在线精品一区二区三区激情 |
国产盗摄一区二区 |
国产一区二区三区av电影 |
日本最新不卡在线 |
婷婷综合另类小说色区 |
亚洲一区二区精品视频 |
国产精品久久国产精麻豆99网站 |
91精品国产品国语在线不卡 |
欧美系列日韩一区 |
欧美日韩高清一区 |
欧美精品在线一区二区三区 |
在线观看免费视频综合 |
91蜜桃免费观看视频 |
99精品视频中文字幕 |
av在线不卡电影 |
91一区二区在线 |
欧美日韩精品高清 |
777欧美精品 |
精品国产乱码久久久久久免费
|
欧美视频一区二区三区在线观看 |
99久免费精品视频在线观看 |
成人高清视频免费观看 |
白白色亚洲国产精品 |
94色蜜桃网一区二区三区 |
色综合av在线 |
欧美一级黄色片 |
久久精品欧美日韩精品
|
亚洲人成伊人成综合网小说 |
亚洲视频免费在线 |
日韩影院精彩在线 |
国产麻豆成人精品 |
色狠狠色狠狠综合 |
欧美一卡二卡三卡 |
中文字幕不卡在线 |
亚洲一区二区偷拍精品 |
久久国产剧场电影 |
色视频一区二区 |
久久精品亚洲乱码伦伦中文 |
亚洲品质自拍视频 |
国产凹凸在线观看一区二区 |
在线观看中文字幕不卡 |