天天看點

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

目錄

UObject

Actor種類

AActor

APawn(可操控機關)

AController(控制器)

AGameMode(遊戲模式)

AHUD(HUD)

...

Component種類

UActorComponent(基本元件)

USceneComponent(場景元件)

UChildActorComponent(子演員元件)

UStaticMeshComponent(靜态網格元件)

總結

參考

引擎版本:Unreal Engine 4.22

UE4的最基礎類型是UObject,它提供了如下功能:

GC機制(垃圾回收機制)

引用自動更新

運作時類型識别

反射機制

序列化

自動檢測預設變量的變更

屬性自動初始化

UE4編輯器的自動整合

網絡複制

這樣當我們編寫需要使用以上功能的類時,繼承一下UObject即可。

後面要講的Actor和Component便是這樣做的。

更多功能或細節,可參考源檔案Engine\Source\Runtime\CoreUObject\Public\UObject\Object.h

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

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

在UE編輯器的World Outliner視窗可以看到目前場景的所有Actor執行個體:

AActor類是可以放到遊戲場景中的遊戲對象的基本類型,另外它更強大的能力是可以挂載元件(Component)。

元件提供功能,想讓一個實體Actor擁有更多的功能就可以通過挂載不同的元件實作。

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

可以看到AActor繼承于UObject,然後再派生出各式各樣的Actor類(例如APawn)。這是因為舞台需要放置各式各樣的演員,而在UE4的世界觀裡,演員不僅包含遊戲世界裡的角色、NPC、載具,還可以是一間房子、一把武器、一個掉落的蘋果,甚至一個抽象的遊戲規則、看不見的玩家控制器...

你如果想放置任何有實質作用的東西到遊戲場景中,應該繼承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的執行個體:

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

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

随意點選一個Actor,可以檢視該Actor的所有Component(元件):

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

UActorComponent繼承于UObject,是最基本的元件類型。不過需要注意的是,它沒有Transform,也沒有提供嵌套包含其他Actor元件的功能。

這是因為在UE看來,Actor并不隻是3D世界中的表示,一些不在世界中展示的“不可見對象”也可以是Actor,比如AInfo等,是以這些Actor的元件也就沒有自帶Transform了。

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

繼承于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類圖:

Aery的UE4 C++遊戲開發之旅(1)基礎對象模型
虛幻引擎4 官方文檔 | 中文文檔 《Inside UE4》 - 知乎 | 大钊 UE4對象系統_UObject&UClass - 簡書 | 蛋求疼

部落客最近在通過UE4搗弄關于地形生成的DEMO,順便學習UE4,是以接下來還會有幾篇UE4筆記和地形生成研究的部落格,敬請期待:)

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

至于筆記部落格的标題,算是緻敬笨木頭前輩的《cocos2d-x遊戲開發之旅》吧。

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

作者:KillerAery

出處:http://www.cnblogs.com/KillerAery/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

UE4
下一篇: VSS用途

繼續閱讀