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