1. 程式人生 > >UE4第三人稱射擊遊戲總結一

UE4第三人稱射擊遊戲總結一

第三人稱和第一人稱的區別:

第三人稱:鏡頭在人身後


第一人稱:鏡頭就是眼睛,拿著槍瞎突突

新建專案,建立GameFile資料夾,建立藍圖類的三個類:3P_GameInstance,  3P_GameMode, 3P_GameState分別繼承藍圖類的對應三個類,建立Character資料夾,裡面建立PlayerCharacter資料夾,建立一個藍圖類3P_PlayerController繼承PlayerController,建立藍圖類3P_PlayerCharacter繼承character,開啟epic的工作----->保管庫,選擇其中2個資源,add project ,我們可以看到這兩個分別是角色找掩體和射擊的動畫。(這裡注意的是在GameMode由於版本問題,不能繼承GameMode Base,而要繼承GameMode)

          

選擇第三個

發現工程資料夾中多了2個資料夾,CoverAnimsetPro(找掩體動畫)和RifleAnimsetPro(射擊動畫資料夾) ,把coverAnimset的UE4_Mannequin(模型)資料夾刪除,RifleAnimsetPro的保留,將兩個資料夾裡面的Animations資料夾合併放到Character裡面,把RifleAnimsetPro中UE4_Mannequin也放到character裡面

1、製作人物持槍左右前後移動功能

Animation下面全是一系列的圖片,選擇沒有重定向骨骼的那些動作圖片(這裡沒有繫結的都是黑色的圖片),右鍵繫結骨骼,這裡應該是讓動畫繫結到哪個骨骼上



補充下在匯入的動畫包中檔案這樣,最左側的是關卡檔案,型別為map,中間的是動畫檔案,右側藍色條的為藍圖類,繼承了Character類,最右側為動畫藍圖


在3P_GameController中Edit-->Project Settings--->Input這樣設定


將地圖和模式選項的預設遊戲模式改成3P_GameMode


雙擊3P_GameMode,在Class-->Default Pawn Class中改這3個


在3P_PlayerController中,將四個設定輸入事件匯入,右鍵MoveForward-->Promote to Variable


視訊是這樣連得


自己實際在做的時候是這樣連的

(我們可以看到,視訊裡是將滑鼠的前後和左右的輸入放到兩個變數裡面,通過這兩變數輸入給一個二維混合動畫中來控制人物方向,而自己是將前後左右的輸入放到了movement input當中,它可以在PlayerCharacter中的CharacterMoveMent元件來獲得,該元件的細節中封裝了許多屬性,比如行走的速度,跳躍速度等等,此外由於前後左右是在xy平面,繞z軸旋轉因此只連z軸的線,個人理解)

在GetPlayPawn--->GetControlRotation-->Break Rotation--->取得繞z旋轉也即xy平面的向量,其中Make Rotator返回的return Value就是返回的向量,將它投影到x和y軸即取得了forward vector和right vector

     




在PlayerCharacter右鍵建立Animation-->Animation BluePrint選擇UE4_Mannequin_Skeleton重新命名為3P_PlayerAnimBP,

編輯3P_PlayerAnimBP,在事件圖表中這樣連線,右擊輸入set move Forward變數發現沒有,這是因為該變數在3P player controller中,我們左邊連線controller,另一端的連線再輸入就出來了,

視訊是這樣連得

報錯


這是因為self(目標)沒有連線,我們連上就好,點選編譯,儲存


我的理解是在player controller中設定的是滑鼠和鍵盤輸入和變數的關係,在animBlueprint中設定的是通過player controller來設定變數的值。

這裡特別注意的是從右側MoveForward引出Move Forward需要在埠右鍵promote to variable,上圖是直接右鍵輸入變數名取得的,那樣不對。

實際自己是這樣連得


繼續,在3P_PlayerAnimBP的動畫圖示中new stateMachine,雙擊拖動出走路持槍的BlendSpace ,雙擊,將兩個變數的值賦給它


這裡的ClassRifleStrafeMovement是個BlendSpace


在左側,調整人物移動的速度,右側發現該BlendSpace混合了持槍站立,持槍前走,持槍後走,持槍左走,持槍右走,持槍左跑,持槍右跑,持槍前跑,持槍後跑等至少9中動畫。

最後在最左側這樣設定,讓人物的的移動可以在遊戲中產生位移

視訊是這樣的,他用了2個變數來製作2d混合動畫,自己做的用了1d的混合動畫,輸入是speed,將站立和跑步動畫混合

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

對於BlendSpace的建立步驟如下:(摘自http://gad.qq.com/article/detail/14455)

一般來說建立的是2D的Blend Space


舉例來說,下圖第一種按照速度和方向來設定,底部第一排放置walk的動畫,當速度到達一定值時就融合到頂排run動畫,然後在事件藍圖中根據速度和方向來取值。這裡橫軸是speed,縱軸是direction方向。


但是我們在專案的過程中發現這種方式不會很理想,我們可能需要角色瞬間達到最大速度,而不需要中間的速度融合,從待機到跑,從待機到走都是瞬間完成的動作。在下圖中是我們所採取的另一種方式,跟速度沒有關係,只有方向,在range裡我的經驗是設定-11的範圍,在事件藍圖中設定變數的絕對值取值得到相應的動畫,這麼做是可以避免在遊戲中取值在0.50.1各種情況出現,會導致呈現的動畫並不準確。把待機,走,跑都單獨做BS再進行運動狀態之間的融合切換。也可以變態的把待機,走,跑,蹲各種狀態坐在一個BS中,這種方式比較不易於後續的細節表現的新增。


對於裡面的動畫編輯,按住shift+左鍵可以切換到當前節點的動畫


在左側的Asset Details中可以設定橫軸和縱軸分別是哪兩個變數,最小值和最大值多少


如果我們把角色移動按照各種狀態來融合,那麼整個狀態機的可編輯性強很多,比如說在一個射擊遊戲中,在拿槍的跑動中可能隨時都要瞄準射擊,只要在BS末端加入一個骨骼控制節點單獨控制某根開槍的骨骼即可實現。


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

動畫設定好後,開啟3P_playerCharacter,設定人物的mesh,在Animation中指定為3P_PlayerAnimBluePrint ,再新增一個相機元件。

這樣就實現了人物持槍移動效果,我們運行遊戲,人物可以持槍跑步了。

注意的細節:因為是第三人稱,因此在3P_PlayerCharacter裡的3p_PlayerCharacter元件的旋轉只勾選繞y軸,對相機camera的父物體和本身的旋轉都勾選,(網頁上寫的x軸為pitch,y軸為yaw,z軸為roll但是實際專案中顯示的是x軸為roll,y軸為pitch,z軸為yaw,由於相機是360度都可以看,人物只需要左右轉繞z軸yaw因此這樣勾選)

            

第三人稱視角的相機要360度旋轉,人物只要繞z軸旋轉即可。效果如下


接著人物換裝,我們匯入一個人物模型

在3P_PlayerCharacter中選擇mesh,替換為新的人物mesh,發現只能這樣,原因是跑步的動畫骨骼沒有替換


假如兩個骨骼相近,那麼在3P_PlayerAnimBP重定向骨骼,替換為新匯入模型的骨骼,然後在3P_PlayerCharacter中選擇mesh裡面的Animation指定為新的3P_PlayerAnimBp,把動畫全部右鍵retarget重定向到新骨骼,重寫混合動畫,然後就可以讓另一個人物模型也可以使用舊動畫了。效果如圖


哈哈,還挺流屁的。

2,為人物的動作新增完整的狀態機

然而還不夠,新增跳躍功能,在輸入加入空格,在playercontroller中設定,這裡的Jump函式我個人理解在PlayCharacter裡的CharacterMoveMent中的細節裡面封裝了跳躍的具體屬性

   

在行走持槍基礎上新增快跑持槍的動畫,步驟如下:

在輸入中繫結leftShift按鍵名為SprintButton。在player Controller中,邏輯是這樣的,當人物處在持槍行走狀態下(move forward>0)且按下LeftShift,把bool值is Sprinting置為true,否則為false。


 在playAnimBP中再加入持槍跑步動畫,之前寫好了Rifle Walk動畫,再加入持槍快跑開始,持槍快跑中,持槍快跑停止,並連線。


對於從Rifle Walk到Sprint Start的條件為is Sprinting,


當然前提要加入bool值is Sprinting


從Sprint Start到Sprinting轉換條件為慢走動畫的時間播放結束,這裡用4秒後就進入慢走動畫迴圈狀態

 

從Sprinting到Rifle Stop的切換條件為,Move Forward<=0,從Rifle Stop到Rifle Walk的切換條件為4秒後就切換

從Sprinting到Rifle Walk的切換條件為is Sprinting 為false


值得注意的是,切換到快跑模式時候bool置為true,在Rifle Stop動畫的某一時刻自動將Bool值is Sprinting置為false,

從持槍行走到持槍快跑,和持槍蹲下三個動作,人物速度不一,如何設定?

加入一個變數WalkSpeed,當人物左右前後行走輸入時候,乘以0.7就為行走持槍速度,蹲下或加速跑的時候將變數置為其他值即可



效果如圖:


接下來新增右鍵瞄準,在輸入加入右鍵aiming在playerController中


設定好狀態機,瞄準又分為站立瞄準和瞄準行走,Crouch是蹲下的狀態機。


這樣的話,瞄準行走的速度為0.3,行走持槍速度為0.7,蹲下行走速度0.3,加速跑速度1.0,因此在輸入shift的時候還要分情況判斷,比如,按下加速跑的時候有沒有按瞄準鍵,有沒有按蹲下鍵,這裡蹲下時如下判斷的,右鍵瞄準和加速shift也都要寫成這樣的邏輯。感覺程式碼冗餘度很高,有空再優化下


其次在狀態機條件判斷的時候,要把每種情況充分考慮,這裡只列舉出條件判斷的方式,每個轉換條件都要這樣細化來寫


這樣就把瞄準,持槍行走,持槍快跑和蹲下各種邏輯直接的切換時的速度變化以及動畫切換的邏輯就寫好了,效果如下: