寫在前面
主要是介紹一下UE4中的一些常用概念。
參考的博客如下:
- UE4常用邏輯關(guān)系和說明;
- UE4入門學(xué)習(xí)4:C++編程介紹;
- UE4中基礎(chǔ)的類及其之間的關(guān)系;
- [官方] 虛幻引擎 4 術(shù)語;
- 《圖解UE4渲染體系》Part 0 引擎基礎(chǔ)
一、UE4世界結(jié)構(gòu)
UE4世界的主要結(jié)構(gòu)如下:
-
World (當(dāng)前游戲世界,可以包含多個(gè)Level)
-
Level (關(guān)卡地圖,每個(gè)關(guān)卡被保存為單獨(dú)的
.umap
文件,可以有多個(gè)Sub-Levels)-
Actor(基本實(shí)體,可以被動(dòng)態(tài)添加到Level中)
- Component(組件,隸屬于Actor的功能對(duì)象體,可以為Actor賦予視覺、聲音、運(yùn)動(dòng)等表現(xiàn))
-
Pawn(特殊的Actor,表示游戲中的生命體)
- Controller(控制器,負(fù)責(zé)接受來自玩家或者AI的輸入,賦予Pawn以玩家或者類似玩家的行為)
-
Character(特殊的Pawn,表示游戲中的人,增加了碰撞組件
CapsuleComponent
和人物運(yùn)動(dòng)組件CharacterMovementComponent
)
-
Actor(基本實(shí)體,可以被動(dòng)態(tài)添加到Level中)
-
Level (關(guān)卡地圖,每個(gè)關(guān)卡被保存為單獨(dú)的
- GameMode(定義游戲規(guī)則)
- GameState(游戲狀態(tài),包含玩家列表、得分情況、玩家任務(wù)清單等)
- PlayerState(玩家的狀態(tài),包含名字、得分、等級(jí)等)
Controller有兩種類型,分別是PlayerController和AIController;
隸屬于PlayerController的一些模塊如下:
- HUD(Heads-Up Display,在屏幕上顯示二維的UI信息,如血條和玩家名稱等,每個(gè)PlayerController只有一個(gè)AHUD對(duì)象)
- Camera(相當(dāng)于人的眼睛,提供玩家的視角,每個(gè)PlayerController只有一個(gè)PlayerCameraManager對(duì)象)
PlayerController和Pawn的關(guān)系如下:
二、UE4基本類結(jié)構(gòu)
- 其實(shí)上面所提到的世界中的大部分模塊都是一個(gè)類,但這里只介紹一些常用的類;
1. UObject
-
是所有Object的基類;
-
功能包括垃圾回收、元數(shù)據(jù)、在磁盤和網(wǎng)絡(luò)中的序列化、類屬性和函數(shù)的運(yùn)行時(shí)反射和藍(lán)圖集成等;
-
不能被添加到關(guān)卡Level中,也不能在藍(lán)圖中使用,但可以包含數(shù)據(jù)和函數(shù);
-
常用的宏:
-
UCLASS
:聲明類; -
USTRUCT
:聲明結(jié)構(gòu)體; -
UFUNCTION
:聲明成員函數(shù); -
UPROPERTY
:聲明成員變量;
-
-
一個(gè)例子如下:
USTRUCT()
struct FVector2D
{
UPROPERTY()
float X;
UPROPERTY()
float Y;
UFUNCTION()
float GetLength() const;
}
-
下面介紹一下一些常用宏的說明符;
-
(1)
UPROPERTY()
的常用說明符如下:-
VisibleAnywhere
:在藍(lán)圖面板的詳細(xì)信息和主面板的藍(lán)圖實(shí)例的詳細(xì)信息窗格中都可見,也就是變量在所有的屬性窗口中均可見,但無法編輯; -
VisibleDefaultsOnly
:僅在藍(lán)圖面板的詳細(xì)信息窗格中可見,同時(shí)無法編輯,也就是藍(lán)圖類內(nèi)變量可見,可以得知一個(gè)相對(duì)公共的設(shè)定值; -
VisibleInstanceOnly
:僅在主面板的藍(lán)圖或C++類實(shí)例的詳細(xì)信息窗格中可見,同時(shí)無法編輯,也就是藍(lán)圖對(duì)象內(nèi)變量可見,只能得知一個(gè)相對(duì)私有的設(shè)定值; -
EditAnywhere
:在藍(lán)圖面板的詳細(xì)信息和主面板的藍(lán)圖實(shí)例的詳細(xì)信息窗格中都可見且可被修改,也就是變量在所有的屬性窗口中均可見且可被修改; -
EditDefaultsOnly
:僅在藍(lán)圖面板的詳細(xì)信息窗格中可見且可被修改,修改的是類的值,將影響該類之后生成的所有實(shí)例; -
EditInstanceOnly
:僅在主面板的藍(lán)圖或C++類實(shí)例的詳細(xì)信息窗格中可見且可被修改,修改對(duì)象的值,僅影響當(dāng)前拖動(dòng)到地圖中生成的實(shí)例; -
BlueprintReadOnly
:可在藍(lán)圖中讀取值,但不能修改值; -
BlueprintReadWrite
:既可在藍(lán)圖中讀取值,也可以在藍(lán)圖中修改值; -
Category="xxx|xxx"
:將當(dāng)前變量分組到文件夾中,|
符號(hào)用于創(chuàng)建子文件夾,注意引號(hào)內(nèi)的所有空格均有意義,注意刪掉無意義空格; -
DisplayName="xxx"
:更改在信息窗格中顯示的文本標(biāo)簽名字; -
ToolTip="xxx"
:當(dāng)鼠標(biāo)懸停到信息窗格的對(duì)應(yīng)屬性時(shí)出現(xiàn)的提示信息文本,如果沒有,則默認(rèn)使用代碼中的注釋內(nèi)容;
-
-
參考:
- UE4 C++學(xué)習(xí) 淺析UProperty屬性說明符;
- [官方] https://docs.unrealengine.com/5.0/zh-CN/unreal-engine-uproperty-specifiers/;
-
一些補(bǔ)充說明:
- 所有帶
Edit
的說明符和帶Visible
的說明符不能同時(shí)出現(xiàn),只能出現(xiàn)其中一種; -
BlueprintReadOnly
和BlueprintReadWrite
起碼要出現(xiàn)一個(gè),不然在藍(lán)圖中右鍵是找不到這個(gè)屬性的;
- 所有帶
-
(2)
UFUNCTION()
的常用說明符如下:-
BlueprintCallable
:該函數(shù)可以在藍(lán)圖中被調(diào)用; -
BlueprintImplementableEvent
:這個(gè)函數(shù)只能用藍(lán)圖實(shí)現(xiàn),不能用C++實(shí)現(xiàn); -
BlueprintNativeEvent
:這個(gè)函數(shù)必須用藍(lán)圖重寫實(shí)現(xiàn),有默認(rèn)調(diào)用的方法(以_Implementation
為后綴,需要用C++實(shí)現(xiàn)),因此在藍(lán)圖中是重寫實(shí)現(xiàn),不能用C++重寫; -
BlueprintPure
:這個(gè)函數(shù)在藍(lán)圖中沒有接口,不能被其他函數(shù)調(diào)用,只能用它的返回結(jié)果,而且不會(huì)緩存它的計(jì)算結(jié)果,每次調(diào)用時(shí)均會(huì)執(zhí)行一次計(jì)算,可以參考:【UE·C++】BlueprintCallable與BlueprintPure區(qū)別; -
DisplayName
和ToolTip
均是元數(shù)據(jù)類型,使用時(shí)應(yīng)寫meta = (MetaTag1="xxx", MetaTag2="xxx", ...)
,更多關(guān)于元數(shù)據(jù)的介紹參考官方文檔:https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/GameplayArchitecture/Metadata/;
-
-
參考:
- UE4 C++學(xué)習(xí) UFunction函數(shù)說明符;
- [官方] https://docs.unrealengine.com/5.0/zh-CN/function-specifiers/;
-
一些補(bǔ)充說明:
-
BlueprintCallable
和BlueprintPure
只能出現(xiàn)一個(gè),前者僅在第一次調(diào)用時(shí)計(jì)算結(jié)果,后者是每次調(diào)用均重新計(jì)算結(jié)果,因此計(jì)算的開銷很大;
-
-
(3)
UCLASS()
的常用說明符如下:-
Blueprintable
:該類可以在主面板右鍵創(chuàng)建基于此類的藍(lán)圖類;
-
-
參考:
- [官方] https://docs.unrealengine.com/5.0/zh-CN/class-specifiers/;
2. AActor
- 繼承于
UObject
; - 是所有Actor的基類;
- 有一個(gè)RootComponent成員變量,用于保存組件樹中的根組件,結(jié)構(gòu)示意如下:
- 一個(gè)Actor如果想被放進(jìn)Level中,就必須先賦予
USceneComponent * RootComponent
一個(gè)SceneComponent對(duì)象,因?yàn)镾ceneComponent對(duì)象能為Actor提供變換信息(位置、旋轉(zhuǎn)和縮放等); - 生命周期的事件:
-
BeginPlay()
:Actor對(duì)象首次在Gameplay中存在時(shí)調(diào)用; -
Tick()
:每幀調(diào)用一次; -
EndPlay()
:Actor對(duì)象離開Gameplay空間時(shí)調(diào)用;
-
3. UActorComponent
-
是所有Component的基類;
-
不可以單獨(dú)存在,只能作為Actor中的成員變量使用;
-
派生的Component類包括:
-
USceneComponent
:使Actor有位置變換的能力,包括位移、旋轉(zhuǎn)和縮放等; -
UPrimitiveComponent
:使Actor有被渲染的能力; -
UMeshComponent
:使Actor有形狀外貌的能力; -
UStaticMeshComponent
:靜態(tài)網(wǎng)格體組件,繼承前面3個(gè)類,是UE4的基本場(chǎng)景構(gòu)建單位,最為常用; -
UChildActorComponent
:可以作為子節(jié)點(diǎn)搭建一棵組件樹;
-
-
它們的關(guān)系如下:
-
其他的組件介紹可以參考官方博客:https://docs.unrealengine.com/4.27/zh-CN/Basics/Components/;
4. APawn
- 繼承于
AActor
; - 有物理表示和基本的移動(dòng)能力;
- 可以被PlayerController或者AIController實(shí)現(xiàn)控制;
5. ACharacter
- 繼承于
APawn
; - 在Pawn的基礎(chǔ)上默認(rèn)掛載了三個(gè)組件:
-
USkeletalMeshComponent
:骨骼網(wǎng)絡(luò)組件; -
UCharacterMovementComponent
:人物移動(dòng)組件,包括走、跑、跳、飛、游泳等; -
UCapsuleComponent
:膠囊體(用于碰撞)組件;
-
-
APawn
和ACharacter
之間的關(guān)系如下:
6. AController
- 可以和Pawn關(guān)聯(lián);
- Controller和Pawn的關(guān)系:
- Controller的抽象級(jí)別要更高一點(diǎn),生命周期也更長(zhǎng),相當(dāng)于一個(gè)控制中心,而Pawn則為一個(gè)被控制的實(shí)體;
- Controller可以搭配不同的Pawn,并負(fù)責(zé)向Pawn輸出某些共有的控制邏輯,或者說是一套行為準(zhǔn)則;
- 每個(gè)Pawn只能認(rèn)領(lǐng)一個(gè)Controller,并接受它所輸出的行為準(zhǔn)則,當(dāng)然,它也可以更換不同的Controller獲得不同的行為準(zhǔn)則;
- Controller和Pawn的關(guān)系示意圖如下:
三、代碼命名規(guī)范
- 類、變量和函數(shù)的命名均用大駝峰式,首字母大寫;
- 每個(gè)類的命名前面均需要加前綴,如下:
-
A
:派生自AActor
的類; -
U
:派生自UObject
的類; -
S
:派生自SWidget
的類; -
E
:枚舉類; -
I
:接口類; -
T
:模板類; -
F
:除上述的其他類;
-
- 和類對(duì)應(yīng)的C++文件名則不加前綴;
-
變量的命名僅布爾變量需要增加前綴,如下:
-
b
:布爾變量;
-
- 如果返回值是布爾類型的函數(shù)的命名需要增加前綴,如下:
-
Is
或者Should
:返回值是布爾類型的函數(shù);
-
四、常用變量類型
1. 基本數(shù)據(jù)類型
-
bool
:布爾類型; -
int8 / uint8
:整數(shù),8bit; -
int16 / uint16
:整數(shù),16bit,相當(dāng)于short int; -
int32 / uint32
:整數(shù),32bit,相當(dāng)于int; -
int64 / uint64
:整數(shù),64bit,相當(dāng)于long long int; -
float
:?jiǎn)尉雀↑c(diǎn)數(shù),32bit; -
double
:雙精度浮點(diǎn)數(shù),64bit;
2. 指針類型
-
PTRINT
:和指針同樣大小的整數(shù);
3. 字符串類型
-
TCHAR
:字符,相當(dāng)于char; FString
FText
FName
4. 容器類型
-
TArray
:動(dòng)態(tài)數(shù)組,相當(dāng)于vector; -
TDoubleLinkedList
:雙向鏈表,相當(dāng)于list; -
TMap
:字典,相當(dāng)于unordered_map; -
TSet
:集合,相當(dāng)于unordered_set; -
TQueue
:隊(duì)列,相當(dāng)于queue;
5. 文件相關(guān)類型
FFileManagerGeneric
-
FArchive
:序列化相關(guān)操作類;
6. 智能指針類型
-
TSharedPtr
:共享指針,針對(duì)普通的C++對(duì)象; -
TWeakPtr
:弱指針,針對(duì)普通的C++對(duì)象; -
TWeakObjPtr
:針對(duì)UObject對(duì)象; TAutoPtr
TScopedPtr
TUniquePtr
7. 其他類型
-
FVector
:空間坐標(biāo)向量,有三個(gè)成員變量,分別代表X軸、Y軸和Z軸;- 可以參考博客:UE4 FVector向量的一些知識(shí);
-
FRotator
:旋轉(zhuǎn)向量,有三個(gè)成員變量Pitch、Yaw和Roll,分別代表繞Y軸、Z軸和X軸旋轉(zhuǎn);- 注意如果該變量可以在細(xì)節(jié)面板上顯示,則會(huì)自動(dòng)轉(zhuǎn)換為X、Y和Z,此時(shí)就各自對(duì)應(yīng)X軸、Y軸和Z軸;
- 也就是說在Editor中顯示是正常的順序;
- 但在C++代碼中是Y軸、Z軸和X軸的順序;
-
FMath
:數(shù)學(xué)函數(shù)功能類;
五、注釋
1. 函數(shù)注釋
- 遵循JavaDoc形式,如下:
/*
* 函數(shù)功能說明
*
* @param 參數(shù)1 參數(shù)1說明
* @param 參數(shù)2 參數(shù)2說明
* @return 返回值說明
*/
返回值類型 函數(shù)名(參數(shù)1, 參數(shù)2);
- 或者用一行注釋說明,如下:
/** 函數(shù)功能及參數(shù)說明 */
返回值類型 函數(shù)名(參數(shù)1, 參數(shù)2);
2. 函數(shù)內(nèi)注釋
- 在代碼的上一行獨(dú)立注釋,如下:
...
// 注釋內(nèi)容
代碼內(nèi)容;
...
- 如果注釋的內(nèi)容太長(zhǎng)可以手動(dòng)分開多段來寫;
六、資源命名規(guī)范
-
資源均放在
Content
文件夾下,每個(gè)資源文件的命名要加上前綴,如下:文章來源:http://www.zghlxwxcb.cn/news/detail-457088.html-
L_
:關(guān)卡(Level / Map); -
BP_
:藍(lán)圖(Blueprint); -
S_
:靜態(tài)網(wǎng)格(StaticMesh); -
SK_
:骨架網(wǎng)格(SkeletalMesh); -
T_
:紋理(Texture); -
PS_
:粒子系統(tǒng)(Particle System); -
WBP_
:組件藍(lán)圖(Widget Blueprint);
-
-
存放資源的文件夾也要對(duì)應(yīng)命名,如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-457088.html
-
Maps
:關(guān)卡; -
Blueprints
:藍(lán)圖; -
Animations
:動(dòng)畫; -
Sounds
:音頻; -
Materials
:材質(zhì); -
Textures
:紋理; -
Effects
:特效;
-
到了這里,關(guān)于Unreal Engine05:UE4基本概念的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!