1. 程式人生 > >[UE4]屬性宣告(Property Declaration)各個巨集的定義及作用

[UE4]屬性宣告(Property Declaration)各個巨集的定義及作用

轉載自:https://www.jianshu.com/p/a86d567be8c3

參考:https://blog.csdn.net/claien/article/details/49358697

 

屬性宣告(Property Declaration)

屬性變數使用標準C ++變數語法宣告,通過使用UPROPERTY巨集來進行屬性宣告標記。

UPROPERTY([specifier, specifier, ...], [meta(key=value, key=value, ...)])
Type VariableName;

屬性修飾符(Property Specifiers)

在宣告屬性時,宣告上可新增修飾符以控制引擎和編輯器針對不屬性的展現。

常用

Category

定義屬性的分類。

UPROPERTY(Category=CategoryName)
Type VariableName;

UPROPERTY(Category="CategoryName|SubCategoryName")
Type VariableName;
UPROPERTY(EditAnywhere, Category = "MyCategory")
int CategoryNum;

UPROPERTY(EditAnywhere, Category = "MyCategory|SubCategory")
int SubCategoryNum;

1

 

2

Blueprint~辨析

BlueprintAssignable

僅能用於Multicast代理。
應顯示該屬性,以供在藍圖中分配。

UPROPERTY(BlueprintAssignable)
Type VariableName;

BlueprintCallable

僅能用於Multicast代理。
應顯示該屬性,以在藍圖程式碼中呼叫。

UPROPERTY(BlueprintCallable)
Type VariableName;

BlueprintReadOnly

這個屬性可以通過藍圖讀取,但不能修改。
這個操作符與BlueprintReadWrite不相容。

UPROPERTY(BlueprintReadOnly)
Type VariableName;

BlueprintReadWrite

此屬性可以讀取或從藍圖寫的。
這個操作符與BlueprintReadOnly不相容。

UPROPERTY(BlueprintReadWrite)
Type VariableName;
[SpecifiersTest.h]
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FStringDelegate, FString, testStr);
...
UPROPERTY(BlueprintAssignable, Category = "Blueprint")
FStringDelegate WriteToLogDelegate;
UFUNCTION(BlueprintCallable, Category = "Blueprint")
void TestAssignable();

// 還是有點不太懂這種方式實際場景怎麼用
UPROPERTY(BlueprintCallable, Category = "Blueprint")
FStringDelegate WriteToLogCall;

UPROPERTY(BlueprintReadOnly, Category = "Blueprint")
int OnlyTime;

UPROPERTY(BlueprintReadWrite, Category = "Blueprint")
int WriteTime;

[SpecifiersTest.cpp]
void ASpecifiersTest::TestAssignable()
{
    UE_LOG(SpecifiersTest, Log, TEXT("This is AssignableTest"));
    if (GEngine)
        GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red, TEXT("This is AssignableTest!"));
}

1

 

2

event

 

test event

 

play - press w

Edit~辨析

EditAnywhere

表示該屬性可從編輯器內的屬性視窗編輯,在原型和例項中。

UPROPERTY(EditAnywhere)
Type VariableName;

EditDefaultsOnly

表示該屬性可通過屬性視窗來編輯,但僅能對原型編輯。

UPROPERTY(EditDefaultsOnly)
Type VariableName;

EditFixedSize

僅限於動態陣列,這使得使用者不能通過UnrealEd屬性視窗來變更陣列的長度。

UPROPERTY(EditFixedSize)
Type VariableName;

EditInline

通過此修飾符使得使用者可編輯UnrealEd的屬性檢視器中的變數所引用的物件屬性。(僅對物件引用可用,包括物件引用陣列)。

UPROPERTY(EditInline)
Type VariableName;
  • EditInline is deprecated.Remove it, or use Instanced instead.

EditInstanceOnly

表示該屬性可通過屬性視窗來編輯,但僅能對例項而非原型進行編輯。

UPROPERTY(EditInline)
Type VariableName;
UPROPERTY(EditAnywhere, Category = "EditCategory")
int EditAnyNum;

UPROPERTY(EditDefaultsOnly, Category = "EditCategory")
int EditDefaultNum;

UPROPERTY(EditAnywhere, Category = "EditCategory")
TArray<int32> EditAnyArray;
UPROPERTY(EditAnywhere, EditFixedSize, Category = "EditCategory")
TArray<int32> EditFixedArray;

\\ UPROPERTY(EditInline, Category = "EditCategory")
\\ int EditInlineNum;

UPROPERTY(EditInstanceOnly, Category = "EditCategory")
int EditInstanceNum;

原型中

 

例項中

Visible~

VisibleAnywhere

表示該屬性在屬性視窗中可見,但無法被編輯。

UPROPERTY(VisibleAnywhere)
Type VariableName;

VisibleDefaultsOnly

表示該屬性僅在原型的屬性視窗中可見,且無法被編輯。

UPROPERTY(VisibleDefaultsOnly)
Type VariableName;

VisibleInstanceOnly

表示該屬性僅在例項的屬性視窗中可見,且無法被編輯。

UPROPERTY(VisibleInstanceOnly)
Type VariableName;
UPROPERTY(VisibleAnywhere, Category = "VisCategory")
int VisAnyNum;
    
UPROPERTY(VisibleDefaultsOnly, Category = "VisCategory")
int VisDefaultNum;

UPROPERTY(VisibleInstanceOnly, Category = "VisCategory")
int VisInstanceNum;

原型中

 

例項中

其他

AdvancedDisplay

屬性被顯示在細節面板的高階下拉框中。

UPROPERTY(EditAnywhere, Category = "Adv")
int AdvNum1;
UPROPERTY(EditAnywhere, AdvancedDisplay, Category = "Adv")
int AdvNum2;

1

2

Const

這個變數是常量,應該匯出為常量。
常量特性不會在編輯器修改。

  • 使用的時候報錯,不清楚為啥 - Unknown variable specifier 'Const'

Transient

該屬性為臨時屬性;不應被儲存,在載入時會被填零。

UPROPERTY(Transient)
Type VariableName;

不懂

  • 一時看不太懂、使用又比較深不常用、需要深入瞭解的,後續有機會再補充

AssetRegistrySearchable

表明此屬性及其值將會為任意將其作為成員變數而包含的資源類示例被自動新增到資源註冊中。
不可用於結構體屬性或引數。

Config

表示該變數將會成為可配置狀態。
當前值可被儲存到ini檔案中,並且將在建立時被載入;無法在預設屬性中被賦值;只讀。

DuplicateTransient

表示該變數的值應的任何型別的重複(複製/貼上,二進位制複製等)的過程中被重置為類的預設值。

Export

僅對物件屬性(或物件陣列)有效。表示當物件被複制(複製/貼上)或匯出到T3D時,被分配給該屬性的物件應完全作為子物件區塊來匯出,而不是僅僅輸出物件引用本身。

GlobalConfig

類似於config修飾符,區別是您不能在子類中過載它;無法在預設屬性中被賦值; 只讀 。

Instanced

僅能用於物件屬性。
當此類的例項被建立時,它會被賦予一個預設分配給此變數的物件的獨特拷貝;用於對在類預設屬性中定義的子物件進行例項化。
類似EditInline和Export修飾符。

Interp

表示該值可由Matinee的浮點或向量屬性軌跡來隨時間驅動。

Localized

此變數的值將定義本地值;最常用於字串;只讀 。

Native

屬性為native:C++程式碼負責對其序列化並顯示給GC。

NoClear

防止該物件引用在編輯器中被設定為None.隱藏編輯器的清除(以及瀏覽)按鈕。

NoExport

僅對native類有效。此變數不應被包含在自動生成的類宣告中。

NonTransactional

表示變更為此變數值將不會被包含在編輯器的撤消/重做歷史中。

Ref

該值在函式呼叫後被複製出來。僅在函式引數宣告中有效。

Replicated

此變數應通過節點網路進行復制。

ReplicatedUsing

此變數應通過節點網路進行復制,在其接受到 Callback 函式後執行。
使用方法: ReplicatedUsing=FunctionName(函式名稱)

RepRetry

僅用於結構體屬性。如無法被完全傳送,請重試複製此屬性(例如,物件引用尚無法通過節點網路來進行序列化)。對於簡單引用來說,這是一個預設值,但對結構體來說,由於頻寬消耗,很多情況下我們不需要。所以除非此標識被定義,否則其會被禁用。

SaveGame

遊戲存檔說明一個簡單的方法,包括明確的領域為檢查點/儲存系統在效能水平。您可以設定要儲存,然後使用代理存檔讀/寫各個領域的標誌。

SerializeText

原生屬性應序列化為文字(文字匯入,匯出文字)。

SimpleDisplay

屬性預設情況下,在詳細資訊面板出現肉眼可見的。

擴充套件

原型 & 例項

總的來說,我是這麼理解的,也不知是否準確:

  • 一個類對應的藍圖類即為原型。
  • 一個類新增至關卡等的物件即為例項。



作者:peony007
連結:https://www.jianshu.com/p/a86d567be8c3
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。