首页 > 解决方案 > 虚幻 4.24.3:如何在 .cpp 文件中声明 UPROPERTY()

问题描述

我想做的事:

在运行时在 Actor 类中创建一个 USceneComponent

    USceneComponent* UnitDesign = NewObject<USceneComponent>(this, FName(*ID));

什么有效:

UnitDesign在头文件(.h)处定义没有问题。

UPROPERTY(VisibleAnywhere)  //I can see UnitDesign in World Outliner
USceneComponent* UnitDesign = NewObject<USceneComponent>(this, FName(*ID));

什么对我不起作用:

UnitDesign在 Actor 类的 BeginPlay() 中定义CPP File(.cpp) -

UPROPERTY(VisibleAnywhere)  //I can NOT see UnitDesign in World Outliner
USceneComponent* UnitDesign = NewObject<USceneComponent>(this, FName(*ID));

任何指针表示赞赏。

标签: c++unreal-engine4

解决方案


如果您总是想创建 UnitDesign SceneComponent,那么您可以使用CreateDefaultSubobject(c'tor only) :

/* .h */
UCLASS()
class AYourActor : public AActor
{
    GENERATED_BODY()

public:
    AYourActor(FObjectInitializer const& ObjectInitializer);

    UPROPERTY(VisibleAnywhere)
    USceneComponent* UnitDesign;
};

/* .cpp */
AYourActor::AYourActor(FObjectInitializer const& ObjectInitializer) :
    UnitDesign(nullptr) /* this is only needed if UnitDesign is not initialized below */
{
    UnitDesign = CreateDefaultSubobject<USceneComponent>(TEXT("Unit Design"));
}

如果它是一个可选的东西,那就有点复杂了,你可以在 c'tor 之后创建一个组件,但你需要更加清楚什么时候让它与VisibleAnywhere. 代码就是

UnitDesign = NewObject<USceneComponent>(this, FName(*ID));
UnitDesign->RegisterComponent();

刷新属性面板的偷偷摸摸的方法是调用:

GEditor->SelectActor(this, true, true);
GEditor->SelectNone(true, true);

“正确”的方法是SDetailsView::ForceRefreshIDetailCustomization. 公平的警告,这是一个巨大的屁股。

旁注UPROPERTY()只能在.h文件中使用,因为它需要对 Unreal Header Tool 可见。


推荐阅读