本節書摘來異步社群《unreal engine 4藍圖可視化程式設計》一書中的第2章,第2.1節,作者: brenden sewell 譯者: 陳東林 責編: 胡俊英,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
開始探索firstpersoncharacter藍圖,以使玩家在關卡中移動時擁有更多的戰術選項。沒做修改前,玩家還隻是局限在一個速度進行移動。我們可以通過藍圖節點監聽按鍵的動作來進行調整,将調整移動速度功能附加在charactermovement藍圖元件中。
現在我們打開firstpersoncharacter藍圖。它與第1章的cylinder- target_blueprint藍圖位于同一個檔案夾下。在内容浏覽器中找到firstperson- character,輕按兩下打開藍圖。選中事件圖表标簽,你将發現有許多的藍圖節點。我們首先研究的是加了stick input注釋的這一組節點,如圖2.1所示。

紅色的觸發器節點在每幀都被調用,并将turnrate和lookuprate節點的值分别通過一個控制器輸入傳遞出去。這些值通常與我們實際用的模拟搖杆的上/下、左/右軸相比對。注意到這裡隻有兩個輸入軸觸發器,卻完成了向上看/向下看、向左轉/向右轉等4個功能,因為向上看與向下看傳遞的axis value為正值和負值,向左轉和向右轉也是一樣,傳遞的axis value為正值和負值。
然後,兩個軸向觸發器的值都與一個變量相乘,表示玩家轉身或向上(下)看的速率。這些值也都與world delta seconds相乘來歸一化,避免了不同幀率的影響,盡管觸發器會每幀都調用,但是玩家速率保持不變。3個輸入引腳的乘積分别傳遞給add controller yaw input函數和add controller pitch input函數。這兩個函數将控制器輸入轉化為展現在玩家錄影機中的效果。
在stick input藍圖節點組下方有另外一個注釋為mouse input的節點組,它們看起來很像。mouse input轉換滑鼠移動輸入,與軸向搖杆控制器不同,它直接擷取資料然後将這些值直接傳遞給相應的add controller yaw input函數和add controller pitch input函數,而不需要像模拟輸入做那些計算。
管理玩家移動功能的節點組的設定與搖杆和滑鼠輸入節點組有些類似。從輸入軸moveforward和輸入軸moveright擷取的軸值是由控制器或鍵盤輸入的。與stick input節點組一樣,movement input節點組也通過傳回負的軸值來完成向後和向左運動的功能。在運動轉換中很大的不同是我們需要actor移動的方向,這樣移動轉換可以被應用正确的方向。方向由get actor forward vector節點和get actor right vector節點擷取并附加給add movement input節點的world direction輸入引腳,如圖2.2所示。
在新的版本中,添加了對vr支援,新增了first person camera、get forward actor、get right actor、is head mounted display enabled等節點,如圖2.3所示。
最後一個與移動相關的就是注釋為jump的節點組。它由輸入動作jump觸發節點、jump函數和stop jumping函數組成,輸入動作jump觸發節點檢測與跳起事件綁定的按鍵的按壓和釋放,并且從按鍵按下至擡起的時間内都有相關函數進行事件監聽。
在fps模闆在藍圖中,綁定了一些玩家輸入動作來産生一些行為,比如向前移動或跳躍。為了建立新類型的行為,我們将新的實體控制輸入添加到玩家動作當中。為了改變遊戲的輸入設定,單擊虛幻編輯器菜單的編輯按鈕,找到項目設定(project settings)選項。在彈出的視窗左側,引擎分類下找到輸入(input)選項并選擇。
在引擎-輸入(engine-input)菜單中的binding(綁定)分類下,有兩個部分,分别稱為:action mappings和axis mappings,其中,action mappings監聽按鍵和滑鼠單擊事件觸發玩家動作;axis mappings針對的玩家移動和事件都有個範圍,比如w鍵和s鍵同樣影響move forward動作,但是結果不一樣(控制角色向前走/向後走)。比如沖刺和變焦功能,它們有啟用或不啟用等兩個選項,是以我們會将它添加作為action mappings。動作和按鍵映射(action mappings,axis mappings)提供了一種通過在輸入行為和激活行為的按鍵之間插入一個中間層來友善地映射按鍵和坐标軸的機制。動作映射針對按鍵按下和釋放,而坐标軸映射則針對具有連續範圍的輸入。
單擊action mappings右側的加号兩次添加兩個action mappings,将第一個重命名為sprint,從下拉菜單中選擇左shift鍵與sprint事件綁定。将第2個動作命名為zoom,然後将它與滑鼠右鍵綁定,如圖2.4所示。
上面我們講到了輸入節點接收控制器輸入并将它應用到遊戲角色中,既然有了基本的了解,接下來将為玩家擴充沖刺(sprint)功能。我們需要在firstperson- character藍圖中設定好一系列的節點。
首先我們需要建立觸發器來激活沖刺功能。回想我們之前将沖刺動作映射到左shift鍵,為了進入那個輸入觸發器,需在事件圖表的空白區域單擊滑鼠右鍵,搜尋sprint,選擇輸入>>動作事件>>sprint(inputaction sprint)事件節點。
現在我們希望修改玩家的移動速度。如果你嘗試添加一個新的節點,在搜尋框内搜尋speed并且勾選情境關聯(context-sensitive),那你将僅僅隻能找到檢測最大速度并校驗是否超過最大速度的節點,而并不能設定最大速度。是以,我們需要檢索到一個值,從firstpersoncharacter附加到actor的角色運動元件上。檢視元件面闆并選中charactermovement(繼承)。之後,細節面闆将會出現一系列的變量,如圖2.5所示。
在這個變量清單中,你可以找到max walk speed。這個變量的值定義了玩家可以達到的最大移動速度,并且它需要成為沖刺(sprint)函數的目标。我們希望從角色移動元件中擷取這個值并添加到事件圖表中。為了做到這個,在元件面闆選中charactermovement(繼承)元件,将它拖曳到事件圖表中,放置在左shift節點附近。這個操作将生成一個character movement節點,如圖2.6所示。
從character movement節點的輸出引腳拖出引線至事件圖表的空白區域,確定勾選了情境關聯,在搜尋框内鍵入“walk speed”,找到設定max walk speed,将輸出動作sprint節點的pressed輸出執行引腳與設定max walk speed節點的輸入執行引腳連接配接,使得按下左[shift]鍵的時候能夠修改最大移動速度。最後,在輸出動作sprint節點中改變max walk speed的值,将預設數值由0.0改為2200。
我們同樣需要確定玩家能夠在左[shift]按鍵擡起的時候減速。為了做到這個,再次從character movement節點的輸出引腳拖出引線,然後在搜尋并添加另一個設定max walk speed節點。這次連接配接輸出動作sprint節點的released輸出執行引腳和新的設定max walk speed節點的輸入執行引腳,然後将max walk speed的預設值0.0改為600。為了養成良好的添加注釋的習慣,選中本節我們添加的所有節點後,按下[c]鍵(或者單擊滑鼠右鍵,選擇注釋組>>從選中項中建立注釋,将注釋命名為sprint,如圖2.7所示。
現在編譯、儲存,最小化藍圖後在ue4編輯器中按下播放按鈕進行測試。你将會注意到當你在移動過程中按下左[shift]按鍵時,玩家角色顯著地提高了速度。