【虚幻引擎】UE4虚幻架构之属性修饰符

UnrealEngine Doc
官方文档比较零碎,而且有些只看文字描述还不易理解,索性自己多动手多实践,加深理解。


属性声明(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

属性默认情况下,在详细信息面板出现肉眼可见的。

扩展

原型 & 实例

总的来说,我是这么理解的,也不知是否准确:

  • 一个类对应的蓝图类即为原型。
  • 一个类添加至关卡等的对象即为实例。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容