在虚幻引擎4的Editor Widget中获取游戏状态

时间:2019-10-27 19:27:30

标签: unreal-engine4

我有一个编辑器小部件,并且在其中创建了一些按钮单击事件的蓝图。

不幸的是,当我使用“获取游戏状态”节点(或任何类似节点)时,它始终返回null。

我了解到我没有在编辑器中点击“播放”(没有游戏状态实例)是正确的。但是一旦点击Play,当我单击Editor Widget上的按钮时,它们都是一样的-它返回null。同时,游戏窗口中的常规小部件确实会返回游戏状态引用。

那么,假设游戏正在玩(我按下“播放”按钮),如何访问编辑器小部件内的游戏状态(就像在普通小部件中一样)?

p.s。我正在研究简单的单人游戏情况。

1 个答案:

答案 0 :(得分:2)

您必须具有有效的世界上下文对象。

Editor Utility Widget内使用获取游戏状态节点时,世界上下文对象引脚会暴露。

Get Game State node in a Widget Blueprint

在“ Actor蓝图”中,世界上下文对象仍然存在,但是编辑器隐藏了该图钉,因为它可以自动确定。

Get Game State node in an Actor Blueprint

世界上下文对象是可以返回到UObject对象的任何UWorld。对于Actor蓝图,通过将那个actor传递到GetWorldFromContextObject,蓝图编辑器可以简单地将该actor用作 World Context Object

另一方面,

您的编辑器窗口小部件蓝图没有与可以用作世界上下文对象的对象绑定的对象,因此您必须以某种方式提供一个。

使用蓝图中选定的演员

这里是如何使用所选角色作为世界上下文对象来获取游戏状态的示例。要使用此示例,请创建一个带有单个按钮的Editor Utility Blueprint,并将下面的Blueprint图用作按钮单击处理程序。然后运行该小部件,并启动“在编辑器中播放”,然后放置播放器(F8),选择场景中的任何演员,然后单击按钮。您应该会看到当前记录的时间。

Using Get Game State in an Editor Utility Widget Blueprint

使用C ++

或者,您可以创建一个Blueprint可调用的C ++函数,该函数直接循环遍历引擎的世界,并将最合适的函数返回给Blueprints。

.h文件

UCLASS()
class MYPROJECT_API AMyProjectGameModeBase : public AGameModeBase
{
    GENERATED_BODY()

public:

    UFUNCTION(BlueprintCallable)
    static UWorld* MyGetWorld();

};

.cpp文件

#include "Engine/Engine.h"

UWorld* AMyProjectGameModeBase::MyGetWorld()
{
    // Prefer PIE Worlds.
    // Fallback to Game Preview Worlds.
    // Ignore all other types (e.g., other preview worlds).

    UWorld* PIE = nullptr;
    UWorld* GamePreview = nullptr;

    for (FWorldContext const& Context : GEngine->GetWorldContexts())
    {
        switch (Context.WorldType)
        {
        case EWorldType::PIE:
            PIE = Context.World();
            break;
        case EWorldType::GamePreview:
            GamePreview = Context.World();
            break;
        }
    }

    if (PIE)
    {
        return PIE;
    }
    else if (GamePreview)
    {
        return GamePreview;
    }

    return nullptr;
}

请注意,在本示例中,我将函数置于游戏模式下,这可能不是您在组织上放置的位置,但这只是出于演示目的,因为在创建新的C ++项目时会自动创建游戏模式C ++文件来自基本模板。

还请注意,您尝试执行的操作有点粗略。编辑器实用程序是要在编辑器的上下文中运行的,它可以在加载许多世界后幸免于难。如果您希望能够按下与场景交互的按钮,则最好执行以下操作之一:

  • 使用UMG或Slate在游戏本身中放置一个调试按钮
  • 在游戏本身中创建一个控制台命令(可能需要C ++,我从未在蓝图中尝试过此操作)
  • 如果这仅适用于特定类型的actor,则为该actor创建一个自定义详细信息面板(需要C ++)。