c++ - 虚幻 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));
任何指针表示赞赏。
解决方案
如果您总是想创建 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::ForceRefresh
从IDetailCustomization
. 公平的警告,这是一个巨大的屁股。
旁注UPROPERTY()
只能在.h
文件中使用,因为它需要对 Unreal Header Tool 可见。
推荐阅读
- r - 在 R while 循环中 CPU 接近 100%
- java - 如何为 Java Swing 创建加载屏幕?
- powerapps - 如何在网站中嵌入 Power App 小部件?
- python - random.randrange 中的数字必须都是整数吗?
- php - PostgreSQL 整数字段在 PHP 中作为字符串返回
- java - Java:如何用单个字符替换连续字符?
- python-3.x - 在装饰器中分配 self 时如何将其传递给函数实例?
- typescript - 打字稿错误:“任何”类型的参数不可分配给“从不”类型的参数 - 在访问数组中的特定键时
- json - 无法确定哪个属性值为空?
- c# - How to send log to url with nlogger in winform c#.?