美文网首页虚幻4ue c++
【虚幻引擎】UE4虚幻架构之属性修饰符

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

作者: peony007 | 来源:发表于2017-02-27 14:33 被阅读688次

    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

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

    扩展

    原型 & 实例

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

    • 一个类对应的蓝图类即为原型。
    • 一个类添加至关卡等的对象即为实例。

    相关文章

      网友评论

      • 多罗猫_游戏人: UPROPERTY(Category = "Power") 和UPROPERTY(Category = Power) 有什么区别吗?
        peony007:@多罗猫_游戏人 哈哈~我问了下高手,他说这样单个单词的话两者是都可以的,如果多个单词且中间有空格的话,第二种就会编译不过了,你可以实践下,我最近没做这块了~:smile: ~我们都觉得不带引号的写法感觉还是不太符合编程规范的,虽然可以那么用!可能UE为了方便大家是兼容这种省略写法的。
        多罗猫_游戏人:@peony007 我最近在学习官方的案例 里面有 但不知道为什么 唉
        peony007:有引号代表是个字符串,没引号的是个啥呢!?啥也不是吧,应该是不能这么用吧~更别说区别了
        我也不是很懂!O(∩_∩)O哈哈~不懂就老实按规矩来:sweat_smile:

      本文标题:【虚幻引擎】UE4虚幻架构之属性修饰符

      本文链接:https://www.haomeiwen.com/subject/acnbwttx.html