【问题标题】:Unreal - How to avoid hardcoded path when creating an object in cpp虚幻 - 在 cpp 中创建对象时如何避免硬编码路径
【发布时间】:2021-06-05 02:25:56
【问题描述】:

以下代码一直困扰着我:

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);
    }
}

也就是说,我正在硬编码一条路径。如果我决定我想在路上使用不同的对象怎么办?想象一下,我有多个棋子都硬编码来使用这个资产。在 cpp 中,没有简单的方法可以更改所有这些引用。我有一个好主意,将我的网格选择暴露给蓝图,以利用 Unreal 的参考处理,如下所示:

UPROPERTY(EditDefaultsOnly, Category = "References")
UStaticMesh * m_staticMesh;

但是,当我使用蓝图从此类继承并设置默认网格 (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 两种方法都可以编译,但后者无法正常工作。

对于如何正确实现上述功能的任何建议表示赞赏。如果您知道避免硬编码路径的更好方法,请告诉我。

【问题讨论】:

  • 一些测试表明if(m_staticMesh) 条件未能通过。我不明白为什么我已经在我的蓝图子类中设置了默认值。

标签: c++ unreal-engine4 unreal-blueprint


【解决方案1】:

一般不推荐使用静态构造函数助手。

组合组件的 Actor 并利用虚幻反射系统将这些组件及其属性暴露给编辑器以在蓝图中进行修改是理想的模式。

/* Weapon Mesh. */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Weapons")
UStaticMeshComponent* Mesh;

使用VisibleAnywhere 标记在构造期间创建的组件将导致它在创建该Actor 的子蓝图后出现在Actor 组件视图中的组件层次结构中。

然后您将有权修改其属性,例如静态网格物体。

在使用 UPROPERTY 以及所有函数和类说明符及其元数据时,了解有效的属性说明符是很有用的。

Property Specifiers

【讨论】:

  • 感谢您的提示。这是我使用上述方法制作的教程系列中的一个视频:youtube.com/watch?v=caG6N0mXhz0 视频有一个链接到 github 的代码。
猜你喜欢
  • 2011-01-07
  • 2011-01-01
  • 2012-02-26
  • 1970-01-01
  • 2022-10-31
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
相关资源
最近更新 更多