UE4屬性反射宏UPROPERTY和UFUNCTION


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++"))
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM