虚幻引擎:从文件路径

时间:2016-06-24 08:18:52

标签: unreal-engine4 unreal-blueprint

美好的一天!我刚开始研究虚幻引擎4.12一周了。由您自行决定 - 我对C ++编程知之甚少。 (虽然我使用PHP编写代码,所以我在某种程度上理解OOP) - 而且,我只是熟悉可视化脚本(蓝图)。

我想要做的是通过加载新的静态网格来改变玩家武器,静态网格将来自文件路径。目前没有蓝图节点可以做到这一点,许多文章/论坛建议建立我自己的蓝图节点。

我做了一些研究,我发现了这个:Dynamic Load Object C++ - 这是非常有希望的 - 但是,我不知道实现它。我尝试打开MyProject.h并将其粘贴在那里,我不知道下一步该做什么 - 它会成为一个功能吗?还是蓝图节点?

我愿意接受有关如何实现我想要的其他建议(或指示)。如果还有其他方法可以实现这一目标,请分享并教育我。非常感谢你!

此致

克里斯

1 个答案:

答案 0 :(得分:2)

那个静态负载只是帮手。只有通过UFUNCTION(...)宏标记该函数的标题时,才能调用C ++函数。请参阅this链接。

因此,您可以创建您的功能,并在其实现中,您可以调用该帮助程序。例如:

// Helpers.h
static FORCEINLINE UTexture2D* GetTexture2DByName(const FName& name) {
    return LoadObjFromPath<UTexture2D>(name);
}

UFUNCTION(BlueprintCallable, Category = TCF2Helpers)
    static UTexture2D* GetTexture2DForBlock(UBuildableBlockInfo* blockInfo);


// Helpers.cpp
UTexture2D* UHelpers::GetTexture2DForBlock(UBuildableBlockInfo* blockInfo)
{
    if (!blockInfo)
        return nullptr;

    const FString baseFolder = TEXT("Texture2D'/Game/Textures/HUD/%s");

    if (blockInfo->IsEmptyHand)
        return GetTexture2DByName(*FString::Printf(*baseFolder, TEXT("EmptyHand.EmptyHand'")));

    // another lines of implementation
}

但是你需要问自己,如果你真的需要硬编码。您可以指定类似

的内容
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widgets")
    TSubclassOf<class UObjectWidget> wInGameMenu;

UPROPERTY(BlueprintReadOnly, Category = "Widgets")
    UObjectWidget* InGameMenu;

在覆盖函数BeginPlay的地方(这是由于动态创建小部件)我有:

if (wInGameMenu)
{
    InGameMenu = CreateWidget<UObjectWidget>(this, wInGameMenu);
}

UObjectWidget UUserWidget 的后继者,我的窗口小部件(在编辑器中创建)被重新设置为将该窗口小部件作为固有基础。我定义了应该在我的对象的archetype上创建哪个小部件。

我会这样实现:(如果有人告诉我更好的方式,这可能会改变)

  • WeaponManager 创建为ActorComponent
  • 武器创建为SceneComponent(以便将其附加到骨架套接字上)
  • 每个武器都将拥有基于相同界面的自己的实现(可能会覆盖共同祖先中定义的某些功能?)
  • 你可以拥有多个子孩子(能量武器,射击武器等),这样你就可以获得正确的继承,并避免多次实现同样的事情。
  • 每个武器将定义它的网格和属性 - 再次,如果你硬编码网格路径(它是正常的,因为它是实现),你可以使用这样的代码如果你想在蓝图中编写代码,你可以在原型上设置它。
  • 然后在 WeaponManager 中定义所有武器(例如TArray<TSubclassOf<UWeapon>>
  • 每个武器都应该定义 EWeaponType - 枚举游戏中的所有武器,这样我就可以在TMap中匹配已定义的武器类型,然后根据需要简单地使用它(显示,隐藏) ,改变武器等。)该类型应该硬编码到所有武器实施。

在构造函数中加载网格:

//TerminalObject.h
UCLASS()
class TAUCETIF2_API ATerminalObject : public AStaticMeshActor
{
    GENERATED_UCLASS_BODY()
};

// TerminalObject.cpp
ATerminalObject::ATerminalObject(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{

    static ConstructorHelpers::FObjectFinder<UStaticMesh> mesh(TEXT("StaticMesh'/Game/BuildingObjects/Meshes/terminal.terminal'"));

    checkf(mesh.Succeeded(), TEXT("Failed to find mesh"));

    auto mc = GetStaticMeshComponent();
    checkf(mc, TEXT("Failed to find mesh component"));

    mc->SetStaticMesh(mesh.Object);
}
相关问题