虛幻引擎C++學(xué)習(xí)筆記(二)
五、創(chuàng)建項目
1.創(chuàng)建默認C++空白項目,并重命名項目名稱。
2.在Content目錄中創(chuàng)建_Game文件夾(下劃線開頭可避免字母順序排列)。
3._Game文件夾內(nèi)創(chuàng)建Character、GameMode、Maps文件夾。
4.保存當(dāng)前場景至Maps中,重命名DefalutMap。
5.Settings-項目設(shè)置(ProjectSettings)-Maps&Modes-Defalut Maps-Editor Startup Map與Game Default Map選擇你保存的DefalutMap。
6.進入C++ Classes文件夾,以系統(tǒng)生成的GameModeBase基礎(chǔ)上右鍵點擊,創(chuàng)建藍圖于GameMode文件夾中,重命名GameModeBaseBP(BP表示藍圖)。
7.在World Settings-Game Mode設(shè)置你創(chuàng)建好的GameModeBaseBP。
8.Settings-項目設(shè)置(ProjectSettings)-Maps&Modes-Defalut Mode選擇你創(chuàng)建好的ShooterGameModeBaseBP。
9.保存所有(Save All)。
GameMode保存了你當(dāng)前關(guān)卡(Level)的規(guī)則內(nèi)容,包含了默認Pawn、HUD、Player Controller、Game State、Player State、Spectaor。不同關(guān)卡切換可以設(shè)置不同的GameMode,達成不同的規(guī)則需求(例如開始游戲菜單、多人與單機模式的切換等等)。
六、Character類創(chuàng)建
1.C++ Classes文件夾中創(chuàng)建一個Character類,命名為ShooterCharacter。
2.在ShooterCharacter基礎(chǔ)上右鍵創(chuàng)建藍圖,放入Character文件夾中,并命名為ShooterCharacterBP。
3.打開你創(chuàng)建的ShooterGameModeBaseBP,在Classes-Default Pawn Class中選擇ShooterCharacterBP,編譯保存。
4.Visual Studio的編譯快捷鍵為:Ctrl+Shift+B。
七、調(diào)試語句(UE_LOG)
在開發(fā)過程中,使用調(diào)試語句是十分重要的。使用UE_LOG宏可以在編輯器Output Log窗口看到你在代碼中打印的信息。
CategoryName:使用之前需要先定義Log Category,Category會在Log中體現(xiàn)出來,以便在茫茫Log中更容易區(qū)分其作用或所屬模塊。
Verbosity:ELogVerbosity中定義的枚舉,在輸出窗口中顯示不同的顏色來代表不同語義,例如Log、Warning、All等。
Format:輸出內(nèi)容,并可以使用標準格式化輸出下一參數(shù),如%d、%f、%s等。如果傳入引擎的FString類型的參數(shù),需要加上*號重載。例如:
八、攝像機搖桿創(chuàng)建
SpringArmComponent相當(dāng)于我們的手機自拍桿或攝像機的機械臂,方便我們調(diào)整攝像機的視角,其他引擎要實現(xiàn)這項功能需要自己搭建,而虛幻引擎卻已經(jīng)幫我們寫好這項功能。
1.在我們ShooterCharacter的頭文件的私有區(qū)域?qū)懭肼暶鳌?/p>
變量的開頭需要寫class來編譯器承諾這個組件確實存在,否則編譯器會報錯。
2.在公有區(qū)域?qū)懸粋€getter函數(shù),方便外部獲取這個組件。
像這樣獲取內(nèi)容的簡單函數(shù)(函數(shù)內(nèi)部無其他操作,無循環(huán)),我們可以在開頭寫FORCEINLINE講此函數(shù)轉(zhuǎn)為內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)是C++內(nèi)置的特性,可以將命令編譯器跳過一般的ROI 分析(Return On Investment),提高函數(shù)的執(zhí)行效率。在有寫時候,編譯器會拒絕將一個函數(shù)內(nèi)聯(lián),所以加上FORCE可以強行內(nèi)聯(lián)。
需要強調(diào)的是,內(nèi)聯(lián)函數(shù)不適合內(nèi)部代碼較長或者存在循環(huán)操作的函數(shù),因為導(dǎo)致內(nèi)存消耗代價較高與調(diào)用開銷加大。
3.使用UPROPERTY給CameraBoom進行標記,使其暴露給藍圖中。
meta = (AllowPrivateAccess = "true")可以將一個私有變量公開給藍圖,如果不寫此句私有變量是不允許被暴露給藍圖的,會造成編譯報錯。
4.之前向編譯器承諾CameraBoom存在,那現(xiàn)在就要實現(xiàn)它。在cpp文件的構(gòu)造函數(shù)內(nèi)創(chuàng)建CameraBoom。
5.在文件頭部添加USpringArmComponent的頭文件。
6.頭文件地址尋找有兩種方法:
①在解決方案資源管理器窗口中搜索組件名稱(去掉首字母),并加上.h后綴,點擊頭文件在屬性窗口查看(F4快捷鍵)。
②在官方API文檔中直接搜索組件名稱,復(fù)制include的代碼。地址:
https://docs.unrealengine.com/4.27/en-US/API/
7.編譯保存,打開角色藍圖,可以看到攝像機搖桿CameraBoom已經(jīng)被創(chuàng)建,并且在藍圖詳情中看到該屬性,且不可被編輯修改。
九、跟隨攝像機創(chuàng)建
前面攝像機搖桿創(chuàng)建好之后,加下來就是創(chuàng)建攝像機了。
1.在頭文件聲明FollowCamera變量與返回函數(shù),正如聲明CameraBoom時一樣。
2.在構(gòu)造函數(shù)中實現(xiàn)你聲明的變量。
3.別忘了引入CameraComponent的頭文件。
4.編譯保存,打開角色藍圖,可以看到攝像機安裝到搖桿上了。
十、控制器(Controller)
[官方文檔] ? ?https://docs.unrealengine.com/4.26/en-US/API/Runtime/Engine/GameFramework/AController/
1.控制器Controller是一個不可見、無位置、有方向(一些函數(shù)可以獲取和設(shè)置控制器的旋轉(zhuǎn))的實體。它可以控制Pawn,從而控制其動作的非實體Actor。
2.我們可以通過控制器的旋轉(zhuǎn)信息(FRotator)來計算得出控制器的方向向量(FVector)。
3.控制器的工作流:用戶—>輸入鼠標鍵盤—>控制器—>移動組件—>角色。
十一、實現(xiàn)角色移動
創(chuàng)建輸入映射
1.我們需要創(chuàng)建角色移動的操作指令,這里包括鍵盤與手柄的輸入:
Project Setting—Input—Bindings—Axis Mappings—創(chuàng)建MoveForward與MoveRight兩個輸入映射。
2.使用鍵盤WASD與手柄的Left Thumbstick X/Y-Axis進行控制綁定。
3.這里使用Axis軸映射而非Action是因為角色需要每幀都接受玩家的輸入信息,從而實現(xiàn)即時的控制轉(zhuǎn)向。
控制器控制移動組件
1.打開角色代碼,聲明控制函數(shù)。
2.實現(xiàn)聲明函數(shù)。
3.實現(xiàn)移動組件的執(zhí)行。
4.編譯保存,測試角色水平方向的移動。
十二、每幀時間(DeltaTime)
DeltaTime:兩幀之間的時長。
Frame:幀,一張圖片在屏幕中刷新。這是比秒更小的計量單位,程序以每幀進行畫面渲染(通常60FPS或120FPS才能保證我們感到畫面流暢)。
Frame Rate(FPS):幀率,每秒刷新的幀數(shù)。這個數(shù)值是不斷變動的,幀率越高說明畫面越流暢,硬件越穩(wěn)定幀率變動也越穩(wěn)定。
Tick:與幀是同義詞,函數(shù)Tick里執(zhí)行的事情等同于每幀執(zhí)行的事情。
幀率并不是一個固定的數(shù)值,這影響我們開發(fā)的指定性。例如我們需要讓物體每秒1cm地進行移動,這時我們就應(yīng)該這樣處理:
為了解決這種問題,Tick函數(shù)提供了DeltaTime,方便我們完成需求:
推導(dǎo)過程:
十三、實現(xiàn)角色轉(zhuǎn)向
創(chuàng)建輸入映射
1.我們需要創(chuàng)建角色移動的操作指令,這里包括鍵盤與手柄的輸入:
Project Setting—Input—Bindings—Axis Mappings—創(chuàng)建TurnRightRate與LookUpRate兩個輸入映射。
2.使用鍵盤上下左右反向鍵與手柄的Right Thumbstick X/Y-Axis進行控制綁定。
3.這里使用Axis軸映射而非Action是因為角色需要每幀都接受玩家的輸入信息,從而實現(xiàn)即時的控制轉(zhuǎn)向。
控制器控制移動組件
1.打開角色代碼,聲明控制函數(shù)。
2.聲明基礎(chǔ)轉(zhuǎn)向速率。
3.實現(xiàn)聲明函數(shù)。
4.實現(xiàn)移動組件的執(zhí)行。
5.編譯保存,測試角色的轉(zhuǎn)向功能。
十四、實現(xiàn)鼠標旋轉(zhuǎn)與角色跳躍
鼠標旋轉(zhuǎn)控制視野
1.Project Setting—Input—Bindings—Axis Mappings—創(chuàng)建MouseTurn與MouseLookUp兩個輸入映射。
2.分別綁定Mouse X/Y鼠標輸入,其中MouseY輸入值需改為-1適應(yīng)玩家控制習(xí)慣。
3.代碼綁定,編譯測試。
角色跳躍
1.Project Setting—Input—Bindings—Action Mappings—創(chuàng)建Jump輸入映射。
2.綁定空格鍵與手柄Face Button Bottom。
3.代碼綁定,編譯測試。
1.打開虛幻商城(Marketplace),搜索Paragon,免費下載你喜歡的角色模型資產(chǎn)包。當(dāng)然你也可以添加自己準備好的角色模型。
2.打開角色藍圖ShooterGameModeBaseBP,點擊Mesh加載你下載的模型。
3.虛幻引擎的游戲?qū)ο笫且訶軸方向為正方向,需要把角色的面向?qū)蔢軸方向。
4.把模型位置下拉到與膠囊體平齊,膠囊體要剛好覆蓋模型。