美好的一天!我刚开始研究虚幻引擎4.12一周了。由您自行决定 - 我对C ++编程知之甚少。 (虽然我使用PHP编写代码,所以我在某种程度上理解OOP) - 而且,我只是熟悉可视化脚本(蓝图)。
我想要做的是通过加载新的静态网格来改变玩家武器,静态网格将来自文件路径。目前没有蓝图节点可以做到这一点,许多文章/论坛建议建立我自己的蓝图节点。
我做了一些研究,我发现了这个:Dynamic Load Object C++ - 这是非常有希望的 - 但是,我不知道实现它。我尝试打开MyProject.h并将其粘贴在那里,我不知道下一步该做什么 - 它会成为一个功能吗?还是蓝图节点?
我愿意接受有关如何实现我想要的其他建议(或指示)。如果还有其他方法可以实现这一目标,请分享并教育我。非常感谢你!
此致
克里斯
答案 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上创建哪个小部件。
我会这样实现:(如果有人告诉我更好的方式,这可能会改变)
TArray<TSubclassOf<UWeapon>>
在构造函数中加载网格:
//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);
}