[UE4]属性标签(总结)

来源:互联网 发布:知乎日报rss地址 编辑:程序博客网 时间:2024/05/21 14:51

UE4版本:4.14.3
-内容太多,未完待续,会补充-

属性标签

Edit/Visibility标识符

  • EditAnywhere
  • EditInstanceOnly
  • EditDefaultsOnly
  • VisibleAnywhere
  • VisibleInstanceOnly
  • VisibleDefaultsOnly

蓝图相关

  • BlueprintReadOnly
  • BlueprintReadWrite
  • Category
  • BlueprintAssignable
  • BlueprintCallable
  • Instanced

保存和配置文件

  • SaveGame
  • Config
  • GlobalConfig

蓝图编辑控制

  • NoClear
  • EditFixedSize
  • SimpleDisplay
  • AdvancedDisplay
  • AssetRegistrySearchable

网络

  • Replicated
  • ReplicatedUsing
  • RepRetry

废除

  • EditInline
  • Localized
  • Const

编辑器

  • NonTransactional
  • Interp(Matinee可改变)

未完成内容
DuplicateTransient
Export
NoExport
Native
Ref
SerializeText
Transient

1. Edit/Visibility标识符

此类标识符指定了属性的修改权限和可见性。
允许修改:EditAnywhere、EditInstanceOnly、EditDefaultsOnly。
不允许修改:VisibleAnywhere、VisibleInstanceOnly、VisibleDefaultsOnly。
这6种标签一个属性只能使用其中之一,使用多个会有如下错误:

Found more than one edit/visibility specifier (EditDefaultsOnly), only one is allowed

接下来,用代码和图的形式,直观的感受他们的区别吧。需要注意的概念是,属性编辑面板可以在2个地方找到,Instance代表在Level中的对象的属性编辑面板,Default代表打开的蓝图编辑器属性编辑面板。

public:    UPROPERTY(EditAnywhere)    int32 EditAnywhere_Param = 0;    UPROPERTY(EditInstanceOnly)    int32 EditInstanceOnly_Param = 0;    UPROPERTY(EditDefaultsOnly)    int32 EditDefaultsOnly_Param = 0;    UPROPERTY(VisibleAnywhere)    int32 VisibleAnywhere_Param = 0;    UPROPERTY(VisibleInstanceOnly)    int32 VisibleInstanceOnly_Param = 0;    UPROPERTY(VisibleDefaultsOnly)    int32 VisibleDefaultsOnly_Param = 0;

蓝图编辑器 - 属性编辑面板

场景实例属性编辑面板

2. 蓝图 读/写 标识符

设置此类标签,在使用蓝图时,可以对变量进行Get/Set操作。接下来,关于BlueprintReadOnly和BlueprintReadWrite的使用方法,用代码和图的形式,直观的感受他们的区别吧。

public:    UPROPERTY(BlueprintReadOnly)    int32 BlueprintReadOnly_Param = 0;    UPROPERTY(BlueprintReadWrite)    int32 BlueprintReadWrite_Param = 0;

蓝图读写标识符

3. Category

对变量设置分类。用法如下。

public:    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")    int32 Category_Param = 0;

分类标识符

4. NoClear

防止该对象引用在编辑器中被设置为None。隐藏编辑器的清除(以及浏览)按钮。
需要使用此标签还需要注意以下几点:

  • 对指针变量有用,对值类型无用
  • 需要在代码中指定非空默认值
public:    UPROPERTY(EditAnywhere, NoClear)    TSubclassOf<AActor> NoClear_Param;

下面,是指针类型,但不给默认值的情况,可以使用黄色箭头置为空。
NoClear情况1

下面,是在代码中设置默认值,防止出现None。

APropertyExampleActor::APropertyExampleActor(){    PrimaryActorTick.bCanEverTick = true;    NoClear_Param = APropertyExampleActor::StaticClass();}

NoClear情况2

5. EditFixedSize

此容器变量不能在蓝图中修改长度,即不能增加,减少元素。适用于蓝图的TArray,TSet,TMap。
在4.14.3版本中,蓝图的TSet和TMap还属于试验性功能,可以在EditorPreferences中搜索“tmap”找到对应选项开启。4.15后可以在蓝图中正式使用。
试验性功能TmapTset

public:    UPROPERTY(EditAnywhere, EditFixedSize)    TMap<int32,int32> EditFixedSize_Param;
EditFixedSize_Param.Add(1, 2);EditFixedSize_Param.Add(2, 2);EditFixedSize_Param.Add(5, 2);

下面是未使用此标签的情况。
未使用EditFixedSize标签

下面是使用标签的情况。

使用EditFixedSize标签

6. SimpleDisplay

使属性在细节面板中默认为可见。各种尝试,不知道有什么用,谁知道告诉我啊。

7. AdvancedDisplay

属性被显示在细节面板的高级下拉框中。如图。
高级下拉框

8. NonTransactional

表示变更为此变量值将不会被包含在编辑器的撤消/重做历史中。

9. Config and GlobalConfig

标记了此标识符的属性,可以在配置文件中读写,下面这篇博客文章写得非常详细。
转载内容 - Jerish的博客 - UE4 Config配置文件详解

10. Replicated

此变量应通过节点网络进行复制。
相关文档与博客:
Unreal官方文档 - 属性复制
Unreal官方文档 - 条件属性复制
UE Wiki - Replication

基本够用的简单方法是,如下,使用DOREPLIFETIME宏别忘了包含UnrealNetwork.h头文件哦。

//PropertyExampleActor.h filepublic:    virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;    UPROPERTY(Replicated)    int32 Replicated_Param;
//PropertyExampleActor.cpp fileAPropertyExampleActor::APropertyExampleActor(){    bReplicates = true;}void APropertyExampleActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const{    DOREPLIFETIME(APropertyExampleActor, Replicated_Param);}

11. ReplicatedUsing

此变量应通过节点网络进行复制,在其接受到 Callback 函数后执行、
使用方法: ReplicatedUsing=FunctionName(函数名称)
注意,C++中服务端控制对象的变量在改变时,不会自动调用FunctionName方法。
详细内容可以查看这篇博客。
XIAOZHI0999的专栏 - ue4 RepNotify ReplicatedUsing 区别

例子:

//PropertyExampleActor.hpublic:    UPROPERTY(BlueprintReadWrite, ReplicatedUsing = OnRep_ExampleFunc)    int32 ReplicatedUsing_Param = 0;    UFUNCTION()    void OnRep_ExampleFunc();
//PropertyExampleActor.cppvoid APropertyExampleActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const{    DOREPLIFETIME(APropertyExampleActor, ReplicatedUsing_Param);}void APropertyExampleActor::OnRep_ExampleFunc(){    UKismetSystemLibrary::PrintString(GetWorld(), TEXT("OnRep called. Variable is changed."));}

12. RepRetry

仅用于结构体属性。如无法被完全发送,请重试复制此属性(例如,对象引用尚无法通过节点网络来进行序列化)。对于简单引用来说,这是一个默认值,但对结构体来说,由于带宽消耗,很多情况下我们不需要。所以除非此标识被定义,否则其会被禁用。

13. SaveGame

找了蛮多资料,没搞定,不知道怎么用这个,如果谁研究出来了,请您告诉我,多谢。
保存信息功能其实有别的解决方案,根据实际情况进行取舍选择:

  • SaveGame类
  • Config文件读写
  • 序列化与反序列化,文件存储
  • 数据库读写

14. 委托方法

蓝图中想要调用C++的委托方法,需要BlueprintCallable,BlueprintAssignable,二者可以结合使用。

BlueprintCallable

标记除了委托类型之外的类型,编译会报:

‘BlueprintCallable’ is only allowed on a property when it is a multicast delegate

正确的用法如下。

// some include file...DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOneParamDelegate, int32, ParamInt);UCLASS()class TESTSCREEN_API APropertyExampleActor : public AActor{    GENERATED_BODY()public:     UPROPERTY(BlueprintCallable)    FOneParamDelegate BlueprintCallable_Param;}

在蓝图中是可以发消息到这个委托方法中的。
BlueprintCallableDelegate

BlueprintAssignable

这个标识符,使C++的委托可以在蓝图中绑定。用法如下。

public:    UPROPERTY(BlueprintAssignable)    FOneParamDelegate BlueprintAssignable_Param;

BlueprintAssignableDelegate

15. Interp

表示该值可由Matinee的浮点或向量属性轨迹来随时间驱动,经过尝试,针对float和FVector类型有效,其他类型无效。

public:    UPROPERTY(Interp)    int32 InterpInt_Param; // 虽然不会报错,但是没有用    UPROPERTY(Interp)    float InterpFloat_Param;

在Matinee中使用

Matinee应该使用的越来越少了,被Sequence代替了。
Interp1

Interp2

在Sequence中使用

Interp3

16. Instanced

官方:仅能用于对象属性。当此类的实例被创建时,它会被赋予一个默认分配给此变量的对象的独特拷贝。用于对在类默认属性中定义的子对象进行实例化。类似EditInline和Export修饰符。
首先这个标识符只能修饰对象指针。

public:    UPROPERTY(Instanced, EditAnywhere)    AMyInstanceActor* Instanced_Param;

下面这种类型变量是不行的。

public:    //error : 'Instanced' cannot be applied to class properties (UClass* or TSubclassOf<>)    UPROPERTY(Instanced, EditAnywhere)    TSubclassOf<AMyInstanceActor> failed;

在AMyInstanceActor类中增加一个用于测试的变量,InstanceParam_Int。

//MyInstanceActor.hpublic:    // 测试instanced标识符    UPROPERTY(EditAnywhere)    int32 InstanceParam_Int;

运行后执行SpawnTemp方法,在场景中创建一个AMyInstanceActor实例,赋值给Instanced_Param。

void APropertyExampleActor::SpawnTemp(){    FTransform spawnTransform = FTransform(FVector(1.0f));    FActorSpawnParameters spawnParam;    spawnParam.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;    Instanced_Param = GetWorld()->SpawnActor<AMyInstanceActor>(AMyInstanceActor::StaticClass(), spawnTransform, spawnParam);}

从图中可以看到,我可以在属性编辑器面板,编辑类实例的属性。
Instanced1

Instanced2

17. AssetRegistrySearchable

使对象可以在已注册的资源中选择和查找,对值类型无效。

public:    UPROPERTY(AssetRegistrySearchable, EditAnywhere)    AActor* AssetRegistrySearchable_Param;    //AMyInstanceActor AssetRegistrySearchable_Param;    //TSubclassOf<AActor> AssetRegistrySearchable_Param;

修饰AActor*时的表现。
AssetRegistrySearchable_AActor

修饰AMyInstanceActor*时的表现,仅能查找指定类。
AssetRegistrySearchable_AMyClass

修饰TSubclassOf< AActor >
AssetRegistrySearchable_TSubclassOf

未完待续

0 0
原创粉丝点击