Aery的UE4 C++遊戲開發之旅(1)基礎對象模型

引擎版本:Unreal Engine 4.22網絡

UObject

UE4的最基礎類型是UObject,它提供了以下功能:編輯器

  • GC機制(垃圾回收機制)
  • 引用自動更新
  • 運行時類型識別
  • 反射機制
  • 序列化
  • 自動檢測默認變量的變動
  • 屬性自動初始化
  • UE4編輯器的自動整合
  • 網絡複製
  • ...

這樣當咱們編寫須要使用以上功能的類時,繼承一下UObject便可。
後面要講的Actor和Component即是這樣作的。ide

更多功能或細節,可參考源文件Engine\Source\Runtime\CoreUObject\Public\UObject\Object.h函數

Actor種類

每一個遊戲引擎都會有一個很是重要的遊戲對象類型,在cocos2d-x裏是Node(節點),在Unity3D裏是GameObject(遊戲對象),而在UE4裏,這個重要的角色則是Actor(演員)。學習

可能在UE4引擎設計者的眼裏,遊戲世界是一個舞臺,把各個Actor放置在舞臺上面,便能展示出一出好戲。this

在UE編輯器的World Outliner窗口能夠看到當前場景的全部Actor實例:設計

AActor

AActor類是能夠放到遊戲場景中的遊戲對象的基本類型,另外它更強大的能力是能夠掛載組件(Component)。
組件提供功能,想讓一個實體Actor擁有更多的功能就能夠經過掛載不一樣的組件實現。3d

能夠看到AActor繼承於UObject,而後再派生出各式各樣的Actor類(例如APawn)。這是由於舞臺須要放置各式各樣的演員,而在UE4的世界觀裏,演員不只包含遊戲世界裏的角色、NPC、載具,還能夠是一間房子、一把武器、一個掉落的蘋果,甚至一個抽象的遊戲規則、看不見的玩家控制器...code

你若是想放置任何有實質做用的東西到遊戲場景中,應該繼承AActor類。

APawn(可操控單位)

簡單來講,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(控制器)

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(遊戲模式)

AGameMode繼承於AActor,這是一個很重要的類。由於一個GameMode定義了遊戲的規則(例如如何得分或者其餘方面的系統邏輯內容),咱們常常須要繼承於它編寫本身遊戲的全局規則/全局遊戲邏輯。
因爲遊戲邏輯規則每每是單例的,咱們能夠經過UGameplayStatics::GetGameMode這個靜態函數來獲取GameMode的實例:

AMyGameMode* MyGameMode;
   //獲得本身定義的AMyGameMode實例
   MyGameMode = Cast<AMyGameMode>(UGameplayStatics::GetGameMode(this));

此外GameMode默認是不打開每幀調用Tick事件的,這裏我就被坑了下。

AHUD(HUD)

AHUD繼承於AActor,它是平面顯示界面,就是平時咱們玩3D遊戲提供給玩家的2D菜單界面。AHUD類提供了渲染文字、貼圖、矩形和材質的渲染,建立後也能夠經過藍圖來編輯界面。

...

Component種類

隨意點擊一個Actor,能夠查看該Actor的全部Component(組件):

UActorComponent(基本組件)

UActorComponent繼承於UObject,是最基本的組件類型。不過須要注意的是,它沒有Transform,也沒有提供嵌套包含其餘Actor組件的功能。
這是由於在UE看來,Actor並不僅是3D世界中的表示,一些不在世界中展現的「不可見對象」也能夠是Actor,好比AInfo等,因此這些Actor的組件也就沒有自帶Transform了。

USceneComponent(場景組件)

繼承於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;

UChildActorComponent(子演員組件)

繼承於USceneComponent,提供了Component之下再疊加Actor的能力,擔負着Actor之間互相組合的膠水。這貨在藍圖裏靜態存在的時候其實並不真正的建立Actor,而是在以後Component實例化的時候才真正建立。

UStaticMeshComponent(靜態網格組件)

繼承於USceneComponent,是一個靜態網格組件,也就是提供一個靜態網格物體的渲染效果/物理碰撞等。

...

總結

實際上,UE4的Actor-Component系統就與Unity3D的GameObject-Component系統很類似。
一個遊戲場景裏擺放若干個演員(Actor),每一個演員雖然空無一物(沒穿衣服),可是能夠經過給它添加不一樣的服飾、臺詞等(Component)從而展示出不少不一樣的性質,從而呈現出一款精彩的遊戲舞劇。

而Actor的各類派生類實際上只是Acotr加上提早準備好這些特定的服飾臺詞,簡單來講就是提供一種特殊演員的模板。

簡要的UObject-Actor-Component UML類圖:

參考


博主最近在經過UE4搗弄關於地形生成的DEMO,順便學習UE4,所以接下來還會有幾篇UE4筆記和地形生成研究的博客,敬請期待:)

至於博客的標題,算是致敬笨木頭前輩的《cocos2d-x遊戲開發之旅》吧。

系列其餘文章:Aery的UE4 C++開發之旅系列文章

相關文章
相關標籤/搜索