2018-10-15 一些基礎知識點

參考文章:
http://api.unrealengine.com/CHN/Programming/Introduction/index.html

  • 屬性從載入過程被初始化后,才會對每秒傷害數(shù)值進行計算。虛幻編輯器中的運行時變更并非原因所在。因為目標對象在編輯器中被更改時引擎將對其進行通知,所以該問題擁有簡單的解決方法。以下代碼顯示派生值在編輯器中發(fā)生變化時進行計算所需要添加的鉤。
void AMyActor::PostInitProperties()
{
    Super::PostInitProperties();

    CalculateValues();
}

void AMyActor::CalculateValues()
{
    DamagePerSecond = TotalDamage / DamageTimeInSeconds;
}

#if WITH_EDITOR
void AMyActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
    CalculateValues();

    Super::PostEditChangeProperty(PropertyChangedEvent);
}
#endif
  • PostInitProperties() 調用鏈掛鉤即可基于設計師設置的數(shù)值創(chuàng)建默認值。
  • PostEditChangeProperty() 法存在于編輯器特有的 #ifdef 中。
    這是為了用游戲必需的代碼進行游戲構建,并刪除使可執(zhí)行文件容量無謂變大的多余代碼。
UFUNCTION(BlueprintCallable, Category="Damage")
void CalculateValues();

UFUNCTION() 宏把 C++ 函數(shù)對反射系統(tǒng)公開。BlueprintCallable 選項將其對藍圖虛擬機公開。每個對藍圖公開的函數(shù)都需要與其相關的類型,右鍵單擊快捷菜單才能正常使用。下圖顯示了類型對快捷菜單的影響。

UFUNCTION(BlueprintImplementableEvent, Category="Damage")
void CalledFromCpp();
UFUNCTION(BlueprintNativeEvent, Category="Damage")
void CalledFromCpp();
void AMyActor::CalledFromCpp_Implementation()
{
}

這幾個方法沒有完全理解它的作用,以后需要使用的時候再來學習

游戲性類:對象、Actor 和組件

多數(shù)游戲性類派生自 4 個主要類型。它們是 UObject、AActor、UActorComponent 和 UStruct。

虛幻對象(UObject)

虛幻引擎中的基礎構建塊被稱作 UObject。此類結合 UClass 提供引擎中最重要的若干基礎服務:

  • 屬性和方法反射
  • 屬性序列化
  • 垃圾回收
  • 按命名查找 UObject
  • 可配置屬性數(shù)值
  • 屬性和方法網(wǎng)絡支持
    派生自 UObject 的每個類擁有一個為其創(chuàng)建的單例 UClass,此對象包含關于類實例的所有元數(shù)據(jù)。UObject 和 UClass 是游戲性對象在其生命期中執(zhí)行所有操作的根源。區(qū)分 UClass 和 UObject 的最佳方式:UClass 描述 UObject 實例的組成、可用于序列化的屬性、網(wǎng)絡等。多數(shù)的游戲性開發(fā)不會直接從 UObject 進行派生,而從 AActor 和 UActorComponent 進行派生。編寫游戲性代碼無需了解 UClass/UObject 的工作細節(jié)。但了解這些系統(tǒng)的存在也會有所幫助。

AActor

AActor 是作為游戲體驗一部分的對象。AActor 將被設計師放置在關卡中,或通過游戲性系統(tǒng)在運行時創(chuàng)建。所有可放入關卡的對象均延展自此類。范例有 AStaticMeshActor、ACameraActor 和 APointLight actor。AActor 派生自 UObject,因此可使用上一部分列出的所有標準功能??赏ㄟ^游戲性代碼(C++ 或藍圖)顯式銷毀 AActor。
AActor 擁有一系列事件,可在生命周期中進行調用。以下列表是說明生命周期的簡化事件集。

  • BeginPlay - 對象首次出現(xiàn)在游戲進程中時調用
  • Tick - 每幀調用一次,在一段時間內(nèi)執(zhí)行操作
  • EndPlay - 對象離開游戲進程時調用

我們擁有一個用于 actor 生成的方法 - UWorld::SpawnActor()。一旦 actor 成功生成后,它的 BeginPlay() 方法將被調用,下一幀將出現(xiàn) Tick()。一旦 actor 的生命期完結,即可調用 Destroy() 將其銷毀。在此過程中將調用 EndPlay(),在此可設置自定義銷毀邏輯??刂?actor 存在時長的另一個選項是使用壽命成員??稍趯ο蟮臉嫿ê瘮?shù)中設置時間段,或通過運行時的其他代碼進行設置。時間量耗盡后,actor 將自動調用 Destroy()。

基礎標記:

  • UCLASS() 告知虛幻引擎生成類的反射數(shù)據(jù)。類必須派生自 UObject。
  • USTRUCT() 告知虛幻引擎生成結構體的反射數(shù)據(jù)。
  • GENERATED_BODY() UE4 使用它替代為類型生成的所有必需樣板文件代碼。
  • UPROPERTY() 使 UCLASS 或 USTRUCT 的成員變量可用作 UPROPERTY。UPROPERTY 用途廣泛。它允許變量被復制、被序列化,并可從藍圖中進行訪問。垃圾回收器還使用它們來追蹤對 UObject 的引用數(shù)。
  • UFUNCTION() 使 UCLASS 或 USTRUCT 的類方法可用作 UFUNCTION。UFUNCTION 允許類方法從藍圖中被調用,并在其他資源中用作 RPC。

UPROPERTY()標記:

  • Blueprintable 此類可由藍圖延展。
  • BlueprintReadOnly 此屬性只可從藍圖讀取,不可寫入。
  • Category 定義此屬性出現(xiàn)在編輯器 Details 視圖下的部分。用于組織。
  • BlueprintCallable 可從藍圖調用此函數(shù)。

命名規(guī)范

  • 派生自 Actor 的類前綴為 A,如 AController。
  • 派生自 對象 的類前綴為 U,如 UComponent。
  • 枚舉 的前綴為 E,如 EFortificationType。
  • 接口 類的前綴通常為 I,如 IAbilitySystemInterface。
  • 模板 類的前綴為 T,如 TArray。
  • 派生自 SWidget(Slate UI)的類前綴為 S,如 SButton。
  • 其余類的前綴均為 字母 F ,如 FVector。

UE4中的數(shù)字類型

  • int8/uint8 :8 位帶符號/不帶符號 整數(shù)
  • int16/uint16 :16 位帶符號/不帶符號 整數(shù)
  • int32/uint32 :32 位帶符號/不帶符號 整數(shù)
  • int64/uint64 :64 位帶符號/不帶符號整數(shù)

字符串

FString :
FString 是一個可變字符串,類似于 std::string。

FText :
FText 與 FString 相似,但用于本地化文本。

FName
FName 將經(jīng)常反復出現(xiàn)的字符串保存為辨識符,以便在對比時節(jié)約內(nèi)存和 CPU 時間。

TCHAR
TCHARs 用于存儲不受正在使用的字符集約束的字符。

容器

容器也是類,它們的主要功能是存儲數(shù)據(jù)集。常見的類有 TArray、TMap 和 TSet。它們的大小均為動態(tài),因此可變?yōu)樗璧娜我獯笮 ?/p>

TArray

在這三個容器中,虛幻引擎 4 使用的主要容器是 TArray。它的作用和 std::vector 相似,但卻多出許多功能。以下是一些常規(guī)操作:

TArray<AActor*> ActorArray = GetActorArrayFromSomewhere();

// 告知當前 ActorArray 中保存的元素(AActors)數(shù)量。
int32 ArraySize = ActorArray.Num();

// TArrays 從零開始(第一個元素在索引 0 處)
int32 Index = 0;
// 嘗試獲取在給定索引處的元素
TArray* FirstActor = ActorArray[Index];

// 在陣列末端添加一個新元素
AActor* NewActor = GetNewActor();
ActorArray.Add(NewActor);

// 只有元素不在陣列中時,才在陣列末端添加元素
ActorArray.AddUnique(NewActor); // 不會改變陣列,因為 NewActor 已被添加

// 移除陣列中所有 NewActor 實例
ActorArray.Remove(NewActor);

// 移除特定索引處的元素
// 索引上的元素將被下調一格,以填充空出的位置
ActorArray.RemoveAt(Index);

// RemoveAt 的高效版,但無法保持元素的排序
ActorArray.RemoveAtSwap(Index);

// 移除陣列中的所有元素
ActorArray.Empty();

TMap

  • TMap 是鍵值對的合集,與 std::map 相似。TMap 可基于元素的鍵快速尋找、添加、并移除元素。只要鍵擁有為其定義的 GetTypeHash 函數(shù)(稍后對此進行了解),即可使用任意類型的鍵。
  • 假設您創(chuàng)建了一個基于網(wǎng)格的桌面游戲,需要保存并詢問每個方格上的塊。通過 TMap 即可輕松完成。如棋盤尺寸較小且保持不變,還存在更加高效的處理方式。但出于范例的緣故,暫且談到這里吧!

TSet

TSet 保存唯一值的合集,與 std::set 相似。TArray 通過 AddUnique 和 Contains 方法可用作集。然而 TSet 可更快實現(xiàn)這些操作,但無法像 TArray 那樣將它們用作 UPROPERTY。TSet 不會像 TArray 那樣將元素編入索引。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 【回顧目標】 做一份與突穎而出的報表 【評估結果】 比普能報表更有層次感 更直觀的反映數(shù)據(jù)趨勢 能快速讀懂信息 【...
    紅_b1d3閱讀 306評論 0 0
  • 第一節(jié) 分布 統(tǒng)計表 統(tǒng)計圖 # 一、分布 ## 分布(頻次分布)概念:一個概念或變量,它的各個情況出現(xiàn)的次數(shù)或頻...
    米粒_dcf5閱讀 894評論 0 0
  • 原創(chuàng)—九爺 一 大家都知道,前兩天我?guī)胰巳チ颂嗽颇?,當時寫了個...
    等風來_3e79閱讀 434評論 0 0
  • 沒有牛頓,就沒有近代科學。牛頓第一次表明人可以像上帝那樣洞察世界的奧妙,這種思想在思想史上是空前的。
    瑞涵媽咪閱讀 339評論 0 0
  • 盱眙,x+u=xu(一聲),i=yi(二聲)。 大聲念出來,盱眙。二人自駕游的第一站,也是自駕游去了兩次的地方,真...
    漠人閱讀 380評論 0 1

友情鏈接更多精彩內(nèi)容