在本篇日志中,我們將要用一個C++類來實現一個游戲內的物品,同時介紹UCLASS、USTRUCT、UPROPERTY的使用
一、創建一個C++類
我們在UE5的"內容側滑菜單"中,在右側空白中右鍵選擇"新建C++類",然后可以選擇一個想要的父類,這里我們要實現的是物品,所以選擇Object類作為父類
在"類的類型"中選擇公共,使其能夠被其他模塊調用
二、在.h文件中聲明變量
在VS中打開我們剛剛生成的.h文件,"#pragma once"表示這個.h無論被包含多少次,都只會編譯一次,"第三個頭文件是必須最后一編譯的頭文件,所以如果要新添頭文件,必須放在這個頭文件前面。
#pragma once#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Stardust.generated.h"
接著在下面可以看到一個"UCLASS"宏,表明接下來所聲明的類將會暴露給UE5的反射系統。
"Blueprintable"表示這個c++類可以派生出藍圖類。
"GENERATED_BODY()"表示不繼承父類的構造函數,要想繼承父類的構造函數,需要替換為"GENERATED_UCLASS_BODY()"
UCLASS(Blueprintable)
class ASTROMUTATE_2_API UStardust : public UObject
{GENERATED_BODY()
public:};
接下來我們創建一個結構體來表示物品的各個屬性,在結構提前用USTRUCT宏將該結構體暴露給反射。
"BlueprintType"表示該結構體可以作為藍圖中的一種數據類型。
暴露給反射系統的結構體名稱必須以F開頭,在UE編輯器中該結構體的名稱將不包含首字母F,同時須使用"GENERATED_USTRUCT_BODY"宏。
USTRUCT(BlueprintType)
struct FStardustTable
{//星塵數據GENERATED_USTRUCT_BODY()FStardustTable();UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "StardustStruct")FString StardustName;//名稱UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "StardustStruct")EStardustFormEnum StardustForm;//形態UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "StardustStruct")int StardustStackLimit;//堆疊上限
//為增加可讀性,這里只展示了物品的部分屬性
};
接下來我們先聲明一個構造函數,用于在物品生成時初始化屬性。
要聲明暴露給反射系統的變量,需要使用"UPROPERTY"宏。
"EditAnywhere"表示該變量在編輯器中的類默認設置和實例化細節面板中都可以被編輯,"Edit"也可以替換成"Visible",表示該變量只讀。
"BlueprintReadWrite"表示該變量在藍圖中可以獲取和設置,可將"ReadWrite"替換為"ReadOnly"表示該變量在藍圖中盡可獲取。
"Category"可以設置該變量所處的目錄。
第一個聲明的變量為FString,該數據類型與stl中的string類似,為可修改的字符串。
第二個聲明的變量是一個枚舉,枚舉的定義同樣需要先使用"UENUM"宏將其暴露給反射。
"BlueprintType"表示該枚舉可以作為藍圖中的數據類型。
"UMETA"中可以定義枚舉內容在藍圖中顯示的名稱。
UENUM(BlueprintType)
enum class EStardustFormEnum//形態
{Empty UMETA(DisplayName = "Empty"),Type1 UMETA(DisplayName = "Type1"),Type2 UMETA(DisplayName = "Type2"),Type3 UMETA(DisplayName = "Type3"),
};
未完待續