虚幻4C++编程入门(搬运1)
首先我們將使用虛幻編輯器中的類向導生成基礎 C++ 類
,以便藍圖稍后進行延展。下圖展示了向導的第一步 - 新建一個 Actor。
這里根據對character、pawn和actor的描述,知道了pawn是actor類型,而charactor是pawn的一種類型。
進程中的第二步是告知向導需要生成類的命名。下圖顯示的第二步中使用了默認命名。
選擇創建類后,向導將生成文件并打開開發環境,以便開始編輯。這便是生成的類定義。如需了解類向導的更多信息,請查閱此 鏈接 。
這里我們建立了一個繼承與actor類的類myactor。然后可以從微軟的VS里面進行編寫。
就像上面的圖里面的位置,可以找到我們要編寫的myactor的.h和.cpp文件。
myactor.h文件:
#include "GameFramework/Actor.h" #include "MyActor.generated.h"UCLASS() class AMyActor : public AActor {GENERATED_BODY()public: // 設置該 actor 屬性的默認值AMyActor();// 游戲開始時或生成時調用virtual void BeginPlay() override;// 每幀調用virtual void Tick( float DeltaSeconds ) override; };這里的BeginPlay()和Tick( float DeltaSeconds )都是聲明的為虛函數。
BeginPlay() 是一個事件,將告知您 Actor 已以可操作狀態進入游戲中。現在便適合開始類的游戲性邏輯。Tick() 每幀調用一次,對應的時間量為自上次調用傳入的實際運算時間。在此可創建反復邏輯。如不需要此功能,最好將其移除,以節約少量性能開銷。如要移除此功能,必須將構建函數中說明 tick 應該發生的代碼行刪除。以下構建函數包含討論中的代碼行。
而在構造函數里需要聲明actor 設為每幀調用就得用下面的寫法:
AMyActor::AMyActor() {// 將此 actor 設為每幀調用 Tick()。不需要時可將此關閉,以提高性能。PrimaryActorTick.bCanEverTick = true;}構造函數是你在調用這個類時就會默認去調用的,比如你用這個類建立一個對象,然后就會自動調用構造函數去進行初始化。
下面是介紹把屬性出現在虛幻編輯器中,這就要用到宏定義
現在即可創建一些屬性(設計師可在虛幻編輯器中設置這些屬性)。使用特殊宏 UPROPERTY() 即可輕松將屬性公開到虛幻編輯器。只需在屬性聲明之前使用 UPROPERTY(EditAnywhere) 宏即可,如以下類所示。
UCLASS() class AMyActor : public AActor {GENERATED_BODY()UPROPERTY(EditAnywhere)//可以在任何地方編輯。int32 TotalDamage;... };執行這些操作后,即可在編輯器中對數值進行編輯。有多種方式控制其編輯方法和位置。為 UPROPERTY() 宏傳入更多信息可完成此操作。例如:如需 TotalDamage 屬性和相關屬性出現在一個部分中,可使用分類功能。以下屬性聲明對此進行演示。
UPROPERTY(EditAnywhere, Category=”Damage”)
int32 TotalDamage;
用戶需要編輯此屬性時,它將和其他屬性(這些屬性已以此類型命名標記)一同出現在 Damage 標題之下。這可將常用設置放置在一起,便于設計師進行編輯。
現在讓我們將相同屬性對藍圖公開。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=”Damage”)
int32 TotalDamage;
如您所見,存在一個藍圖特有的參數。正是此參數使屬性為可讀取和可編寫狀態。還存在一個單獨選項 - BlueprintReadOnly。可通過此選項使屬性在藍圖中被識別為常量。此外還有多個選項可控制屬性對引擎公開的方式。
繼續討論以下部分之前,我們來添加一些屬性到這個示例類。已有屬性對此 actor 輸出的傷害總量進行控制。我們更進一步,實現隨時間輸出傷害。以下代碼添加了一個設計師可進行設置的屬性,和另一個設計師可查看但無法進行更改的屬性。
UCLASS() class AMyActor : public AActor {GENERATED_BODY()UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")int32 TotalDamage;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")float DamageTimeInSeconds;UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category="Damage")float DamagePerSecond;... };DamageTimeInSeconds 是設計師可進行修改的屬性。DamagePerSecond 屬性是使用設計師設置的計算值(詳見下一部分)。VisibleAnywhere 標記意味著屬性在虛幻編輯器中為可見狀態,但不可進行編輯。Transient 標記意味著無法從硬盤對其進行保存或加載;它應該為一個派生的非持久值。下圖將屬性顯示為類默認的部分。
在構建函數中設置默認值
在構建函數中設置屬性默認值和典型 C++ 類方法一致。以下是在構建函數中設置默認值的兩個例子,它們在功能上相同。
AMyActor::AMyActor() {TotalDamage = 200;DamageTimeInSeconds = 1.f; }AMyActor::AMyActor() :TotalDamage(200),DamageTimeInSeconds(1.f) { }下圖是在構建函數中添加默認值后的屬性視圖。
為支持設計師對每個實例設置屬性,數值也從給定對象的實例數據中加載。此數據應用在構建函數之后。與 PostInitProperties() 調用鏈掛鉤即可基于設計師設置的數值創建默認值。此處的進程范例中,TotalDamage 和 DamageTimeInSeconds 為設計師指定的數值。即時這些數值為設計師指定,您仍然可以為它們提供恰當的默認值,正如我們在上例中執行的操作。
如未向屬性提供默認值,引擎將自動把屬性設為零(指針類設為 nullptr)。
void AMyActor::PostInitProperties() {Super::PostInitProperties();DamagePerSecond = TotalDamage / DamageTimeInSeconds; }下圖是添加以上 PostInitProperties() 代碼后的屬性視圖。
總結
以上是生活随笔為你收集整理的虚幻4C++编程入门(搬运1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于STM32大棚DHT11温湿度监测的
- 下一篇: java实现微信支付宝等多个支付平台合一