一、前言
? ? ? ? 結構體的定義和枚舉類似,枚舉的定義有兩種方式。區別是結構體必須以“F”開頭命名,而枚舉不用。
? ? ? ? 額外再講了一下藍圖生成時暴露變量的方法。
二、實現
2.1、結構體
?1、定義結構體
?代碼如下,注意這個定義的代碼一定要在“UCLASS()”的前面,否則會編譯報錯。另外結構體的命名也必須以“F”開頭,否在也會編譯報錯。通過如下定義的結構體,在藍圖中可以創建一個新的變量,如圖2.1.1所示,然后可以選中剛創建的類型變量。
USTRUCT(BlueprintType)
struct FMyStruct//必須以F開頭
{GENERATED_USTRUCT_BODY()UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyStruct")int32 Health;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyStruct")FString MyName;
};UCLASS()

2、再定義結構體變量
? ? ? ? 通過如下代碼定義一個上述結構體類型的變量,在藍圖中可以編輯和使用該類型的變量,如圖2.1.2所示,為面板中的變量。圖2.1.3為藍圖中調用該定義的變量。
//結構體UPROPERTY(EditAnywhere,BlueprintReadWrite,Category="MyStruct")FMyStruct MyStructValue;


3、結構體和數據表格進行綁定
在代碼中創建一個新的結構體,該結構體繼承數據表類,創建完后需要將所需的頭文件添加到Including中,鼠標懸浮在”FTableRowBase"中通常會出現自動添加的提示按鈕,編譯。
USTRUCT(BlueprintType)
struct FDataStruct :public FTableRowBase
{GENERATED_USTRUCT_BODY()UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyDataStruct")int32 Age;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyDataStruct")FString MyName;
};
然后在編輯器中創建數據表格,并選中剛剛創建的類型,如圖2.1.4所示,打開數據表格即可看到

結構體的具體變量,在添加一個新的行數據后可以對變量進行賦值,如圖2.1.5所示

還有一種創建CSV格式的文件,在文件中定義相同變量名的列數據,如圖2.1.6所示為CSV格式的

表格數據,將其直接拖動到虛幻引擎中的內容處,會自動彈出數據表格的創建窗口,如圖2.1.7所示,在行類型中選中剛剛創建的結構體,然后點擊應用,這個就會將剛剛CSV表中的數據填充到此時創建的數據表中,如圖2.1.8所示。


2.2、定義一個枚舉
1、第一種方式
首先定義一個宏,代碼如下,生成枚舉的反射數據,通過反射將枚舉暴露給藍圖,實現C++和藍圖的通信,BlueprintType的作用是可以在藍圖創建變量的時候也可以作為選項。其中UMETA是操作變量的屬性更改,代碼中修改最終展示的名字。
enum class MyCustomEnum1 :uint8
{OneType UMETA(DisplayName = "One"),TwoType UMETA(DisplayName = "Two"),ThreeType UMETA(DisplayName = "Three"),
};
通過以下代碼可以實現在各類面板和藍圖中使用該變量
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyEnum")MyCustomEnum1 MyEnum1;
2、第二種方式
?第二種定義枚舉的方式代碼如下,這種定義的MyEnumType里只能定義一個,超出會編譯報錯。
UENUM(BlueprintType)//生成枚舉的反射數據,通過反射將枚舉暴露給藍圖,實現C++和藍圖的通信,BlueprintType的作用是可以在藍圖創建變量的時候也可以作為選項
namespace MyEnumType
{enum MyCustomEnum{Type1,Type2,Type3,};
}
3、在藍圖中的呈現
如圖2.2.1所示為第二種方式創建的變量在創建藍圖新變量時可以選中該枚舉作為變量類型。

同時,在藍圖中也可以調用該枚舉,如圖2.2.2所示:

通過以下代碼可以實現在各類面板和藍圖中使用該變量
//枚舉UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyEnum")TEnumAsByte<MyEnumType::MyCustomEnum> MyCustomEnum;
同時也可以在藍圖中調用和編輯該變量,如圖2.2.3所示

2.3、藍圖生成時暴露
定義一個變量如下所示,在ExposeOnSpawn后面可以賦值也可以如下所示,不會影響后續的操作
/// <summary>/// 生成藍圖時暴露的變量/// </summary>UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyExposeOnSpawn", meta = (ExposeOnSpawn))float myExposeOnSpawnValue;
然后在藍圖中可以在生成該類型的類的時候講上述定義的變量暴露出來,如圖2.3.1所示

這個和藍圖中定義的普通變量勾選”生產時公開“是一樣的邏輯和道理。
三、總結
3.1、所有的定義都應該放在“UCLASS()”后面,否則會編譯報錯“Found 'USTRUCT' when expecting class while parsing class”。
3.2、結構體的命名必須以“F”開頭,否則會編譯報錯“Struct 'MyStruct' has an invalid Unreal prefix, expecting 'FMyStruct”,枚舉的命名不用任何固定開頭。
3.3、兩種枚舉定義的方式不同,在C++代碼中聲明定義后的變量方式也不同。
3.4、結構體和數據表的關系。