Unreal - 在 cpp 中创建对象时如何避免硬编码路径
Unreal - How to avoid hardcoded path when creating an object in cpp
下面的代码一直困扰着我:
ARollingBall::ARollingBall()
{
UStaticMeshComponent* sphere;
sphere = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ball"));
static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereVisualAsset(TEXT("/Engine/BasicShapes/Sphere"));
sphere->SetupAttachment(RootComponent);
if (SphereVisualAsset.Succeeded()) {
sphere->SetStaticMesh(SphereVisualAsset.Object);
}
}
也就是说,我正在对路径进行硬编码。如果我决定以后要使用不同的对象怎么办?想象一下,我有多个 pawn 都被硬编码为使用此资产。在 cpp 中,没有简单的方法来更改所有这些引用。我有个好主意,将我的网格选择公开给蓝图,以利用 Unreal 的参考处理,如下所示:
UPROPERTY(EditDefaultsOnly, Category = "References")
UStaticMesh * m_staticMesh;
但是,当我使用蓝图继承此 class 并设置默认网格 (m_staticMesh) 时,以下内容不会创建网格:
ARollingBall::ARollingBall()
{
UStaticMeshComponent* sphere;
sphere = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ball"));
sphere->SetupAttachment(RootComponent);
if (m_staticMesh) {
sphere->SetStaticMesh(m_staticMesh);
}
}
我正在使用 Unreal 4.21.2 两种方法编译,但后者无法工作。
如有任何关于如何正确实现上述功能的建议,我们将不胜感激。如果您知道避免硬编码路径的更好方法,请告诉我。
通常根本不推荐使用静态构造函数助手。
组成组件的 Actor 并利用 Unreals 反射系统将这些组件及其属性公开给编辑器以在蓝图中进行修改是理想的模式。
/* Weapon Mesh. */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Weapons")
UStaticMeshComponent* Mesh;
使用 VisibleAnywhere
标记在构造期间创建的组件将导致它在创建该 Actor 的子蓝图后出现在 Actors 组件视图的组件层次结构中。
然后您将可以修改其属性,例如 StaticMesh。
在使用 UPROPERTY 以及所有函数和 Class 说明符及其元数据时,了解有效的 属性 说明符是什么很有用。
下面的代码一直困扰着我:
ARollingBall::ARollingBall()
{
UStaticMeshComponent* sphere;
sphere = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ball"));
static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereVisualAsset(TEXT("/Engine/BasicShapes/Sphere"));
sphere->SetupAttachment(RootComponent);
if (SphereVisualAsset.Succeeded()) {
sphere->SetStaticMesh(SphereVisualAsset.Object);
}
}
也就是说,我正在对路径进行硬编码。如果我决定以后要使用不同的对象怎么办?想象一下,我有多个 pawn 都被硬编码为使用此资产。在 cpp 中,没有简单的方法来更改所有这些引用。我有个好主意,将我的网格选择公开给蓝图,以利用 Unreal 的参考处理,如下所示:
UPROPERTY(EditDefaultsOnly, Category = "References")
UStaticMesh * m_staticMesh;
但是,当我使用蓝图继承此 class 并设置默认网格 (m_staticMesh) 时,以下内容不会创建网格:
ARollingBall::ARollingBall()
{
UStaticMeshComponent* sphere;
sphere = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ball"));
sphere->SetupAttachment(RootComponent);
if (m_staticMesh) {
sphere->SetStaticMesh(m_staticMesh);
}
}
我正在使用 Unreal 4.21.2 两种方法编译,但后者无法工作。
如有任何关于如何正确实现上述功能的建议,我们将不胜感激。如果您知道避免硬编码路径的更好方法,请告诉我。
通常根本不推荐使用静态构造函数助手。
组成组件的 Actor 并利用 Unreals 反射系统将这些组件及其属性公开给编辑器以在蓝图中进行修改是理想的模式。
/* Weapon Mesh. */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Weapons")
UStaticMeshComponent* Mesh;
使用 VisibleAnywhere
标记在构造期间创建的组件将导致它在创建该 Actor 的子蓝图后出现在 Actors 组件视图的组件层次结构中。
然后您将可以修改其属性,例如 StaticMesh。
在使用 UPROPERTY 以及所有函数和 Class 说明符及其元数据时,了解有效的 属性 说明符是什么很有用。