UPROPERTY()
UPROPERTY是UE4中的屬性反射宏。
在C++中是沒有反射概念的,UE中則使用UHT反射工具框架寫出了屬於自己的一套反射。
在UE中使用反射時,首先需要包含頭文件"*.generated.h"。在這里,*表示通配符,代表某文件的名字。如我們創建了MyActor的類,那么在頭文件中需要有 #include“MyActor.generated.h”.如下所示。
#include"CoreMinimal.h" #include"GameFramework/Actor.h" #include"MyActor.generated.h"
包含該頭文件之后,UHT工具就回去掃描"*.generated.h"代表的頭文件,然后在項目中生成generated.h和generated.cpp兩個文件。對於類而言,類上添加UCLASS()和GENERATED_BODY()后,就會生成一套反射數據。在此基礎上,對變量使用UPROPERTY()並結合屬性修飾符和元數據修飾符限定變量,就可以得到特定的變量,如使得變量在在UE的編譯器界面上可見。
主要有三個步驟
1.包含頭文件
2.對類對象使用UCLASS()和GENERATED_BODY();
3.使用UPROPERTY()和UFUNCTION()修飾特定的變量和方法,只有被修飾的變量和方法才能有相應功能。
注意:UCLASS()和GENERATED_BODY()是修飾類的,其他的類型則是通過其他宏限定的。
UPROPERTY()是屬性修飾宏,在括號中可以填寫屬性,每個屬性的意義都不同,在官方文檔 https://docs.unrealengine.com/4.26/zh-CN/ProgrammingAndScripting/GameplayArchitecture/Properties/ 中可以看到各個屬性的含義。
UPROPERTY()常用的屬性有
進行適當測試
首先定義一個c++ class,為MyActor,並且在代碼中定義變量HelloUE4變量
運行代碼,可以看到出現變量HelloUE4,且可編輯。
並且基於此類創建新的藍圖類,在子藍圖類中仍然可以看到HelloUE4變量,可編輯。
前面的屬性用於限制變量的是否可編輯、是否可見等屬性。
在UPROPERTY()中也可以放置元數據修飾符,用於修飾變量的取值等限定。
元數據修飾符為meta,其編寫用法為
UPROPERTY(EditAnywhere, meta = (ClampMin = "10", ClampMax = "100")) int32 HelloUE4;
如果我們相對變量做出一定限制,如最大值、最小值等,則可以使用元數據說明符進行限制。
在創建變量時,變量中會有一些選項,同樣可以在c++中使用元數據修飾符來達到。
如下所示。
UPROPERTY(EditAnywhere, meta = (InstanceEditable = true)) int32 HelloUE4;
有些變量,在c++中不希望別的類能夠訪問到,但是希望藍圖中可以訪問到,則在元數據說明符中可以操作
在c++中,所有的變量都使用UPROPERTY()進行反射,那么所有的方法都使用UFUNCTION()進行反射.
在官方文檔中,這么說到“可利用函數說明符UFUNCTION()將UFunctions對藍圖可視化腳本圖表公開,以便開發者從藍圖資源調用或擴展UFunction,而無需更改C++代碼。”
同時還有,UFUNCTION
宏(位於每個函數上方)讓引擎可以發覺這些函數,以便將它們納入序列化和其他引擎功能中。
也就是,UFUNCTION()的功能都是將在c++中定義的函數在藍圖中可見並使用。
舉例,如果想讓在c++中定義的方法在藍圖中可調用,則
在頭文件中定義
UFUNCTION(BlueprintCallable) void TestFun();
在cpp文件中實現
void AMyActor::TestFun() { UE_LOG(LogTemp, Warning, TEXT("Hello UE4 C++")) }