目錄html
引擎版本:Unreal Engine 4.22網絡
UE4的最基礎類型是UObject,它提供了以下功能:編輯器
這樣當咱們編寫須要使用以上功能的類時,繼承一下UObject便可。
後面要講的Actor和Component即是這樣作的。ide
更多功能或細節,可參考源文件Engine\Source\Runtime\CoreUObject\Public\UObject\Object.h函數
每一個遊戲引擎都會有一個很是重要的遊戲對象類型,在cocos2d-x裏是Node(節點),在Unity3D裏是GameObject(遊戲對象),而在UE4裏,這個重要的角色則是Actor(演員)。學習
可能在UE4引擎設計者的眼裏,遊戲世界是一個舞臺,把各個Actor放置在舞臺上面,便能展示出一出好戲。this
在UE編輯器的World Outliner窗口能夠看到當前場景的全部Actor實例:設計
AActor類是能夠放到遊戲場景中的遊戲對象的基本類型,另外它更強大的能力是能夠掛載組件(Component)。
組件提供功能,想讓一個實體Actor擁有更多的功能就能夠經過掛載不一樣的組件實現。3d
能夠看到AActor繼承於UObject,而後再派生出各式各樣的Actor類(例如APawn)。這是由於舞臺須要放置各式各樣的演員,而在UE4的世界觀裏,演員不只包含遊戲世界裏的角色、NPC、載具,還能夠是一間房子、一把武器、一個掉落的蘋果,甚至一個抽象的遊戲規則、看不見的玩家控制器...code
你若是想放置任何有實質做用的東西到遊戲場景中,應該繼承AActor類。
簡單來講,APawn類是一個表明可被控制的遊戲對象(玩家角色、怪物、NPC、載具等),它繼承於AActor。
對於開發者,每次建立Pawn都得從Pawn類繼承,而後寫各類各樣的實現/添加各類各樣的組件。
因而UE4提供了幾個派生類做爲模板,以便快速編寫本身的Pawn。
ADefaultPawn (默認的可操控單位)
DefaultPawn繼承於APawn,是一個默認的Pawn模板。它默認帶了一個DefaultPawnMovementComponent、SphericalCollisionComponent和StaticMeshComponent。
ASpectatorPawn(觀察者)
SpectatorPawn繼承於APawn,是適用於觀戰的Pawn模板,擁有攝像機「漫遊」的能力。它實際就是提供了一個基本的USpectatorPawnMovement(不帶重力漫遊),並關閉了StaticMesh的顯示,碰撞也設置到了「Spectator」通道。
ACharacter(角色)
Character繼承於APawn,是一個包含了行走,跑步,跳躍以及更多動做的Pawn模板。它含有像人同樣行走的CharacterMovementComponent,儘可能貼合的CapsuleComponent,再加上骨骼上蒙皮的網格。
AController繼承於AActor,Controller經過接受玩家的設備(鍵盤、鼠標等)輸入或者被AI輸入來控制Pawn。實際上一個Pawn能夠被多個Controller操控(例如載具可由一個玩家駕駛,另外一個玩家操控車頂機槍),也能夠切換Controller(例如,完成一段劇本演出時,玩家不能控制主角,而交由劇本腳本控制。)
APlayerController(玩家控制器)
APlayerController繼承於AController,負責接受玩家設備輸入從而控制Pawn,它提供了Camera(控制玩家視角)、設備輸入處理、關聯UPlayer、顯示HUD等功能、切換Level...
AAIController(AI控制器)
AAIController繼承於AController,負責提供AI從而控制Pawn,它提供了導航網格尋路、AI行爲樹、Task系統...
AGameMode繼承於AActor,這是一個很重要的類。由於一個GameMode定義了遊戲的規則(例如如何得分或者其餘方面的系統邏輯內容),咱們常常須要繼承於它編寫本身遊戲的全局規則/全局遊戲邏輯。
因爲遊戲邏輯規則每每是單例的,咱們能夠經過UGameplayStatics::GetGameMode這個靜態函數來獲取GameMode的實例:
AMyGameMode* MyGameMode; //獲得本身定義的AMyGameMode實例 MyGameMode = Cast<AMyGameMode>(UGameplayStatics::GetGameMode(this));
此外GameMode默認是不打開每幀調用Tick事件的,這裏我就被坑了下。
AHUD繼承於AActor,它是平面顯示界面,就是平時咱們玩3D遊戲提供給玩家的2D菜單界面。AHUD類提供了渲染文字、貼圖、矩形和材質的渲染,建立後也能夠經過藍圖來編輯界面。
隨意點擊一個Actor,能夠查看該Actor的全部Component(組件):
UActorComponent繼承於UObject,是最基本的組件類型。不過須要注意的是,它沒有Transform,也沒有提供嵌套包含其餘Actor組件的功能。
這是由於在UE看來,Actor並不僅是3D世界中的表示,一些不在世界中展現的「不可見對象」也能夠是Actor,好比AInfo等,因此這些Actor的組件也就沒有自帶Transform了。
繼承於UActorComponent,它封裝了Transform來表示其位置。因此須要位置表示的Actor就能夠向Actor中添加SceneComponent做爲其RootComponent(例如APawn就自動建立了SceneComponent)。
與此同時,得益於Transform(能夠計算相對位置),SceneComponent能夠容許嵌套包含其餘Actor組件(例如一我的體組件包含身體組件,一個身體組件又能夠包含手組件)。
實際中大部分的Actor是有Transform的,因此咱們會常常設置獲取它的座標。常理來講,咱們的須要先獲取下SceneComponent,而後才能操做其Transform等相應接口。可是這樣太過繁瑣,所以UE爲咱們直接提供了基於Actor的接口,如(Get/Set)ActorLocation,但其實這些接口內部也是轉發到RootComponent的。
同理,Actor能接收處理Input事件的能力,其實也是轉發到Actor內部的UInputComponent* InputComponent;
繼承於USceneComponent,提供了Component之下再疊加Actor的能力,擔負着Actor之間互相組合的膠水。這貨在藍圖裏靜態存在的時候其實並不真正的建立Actor,而是在以後Component實例化的時候才真正建立。
繼承於USceneComponent,是一個靜態網格組件,也就是提供一個靜態網格物體的渲染效果/物理碰撞等。
實際上,UE4的Actor-Component系統就與Unity3D的GameObject-Component系統很類似。
一個遊戲場景裏擺放若干個演員(Actor),每一個演員雖然空無一物(沒穿衣服),可是能夠經過給它添加不一樣的服飾、臺詞等(Component)從而展示出不少不一樣的性質,從而呈現出一款精彩的遊戲舞劇。
而Actor的各類派生類實際上只是Acotr加上提早準備好這些特定的服飾臺詞,簡單來講就是提供一種特殊演員的模板。
簡要的UObject-Actor-Component UML類圖:
博主最近在經過UE4搗弄關於地形生成的DEMO,順便學習UE4,所以接下來還會有幾篇UE4筆記和地形生成研究的博客,敬請期待:)
至於博客的標題,算是致敬笨木頭前輩的《cocos2d-x遊戲開發之旅》吧。
系列其餘文章:Aery的UE4 C++開發之旅系列文章