在虚幻引擎 4 中获取编辑器小部件内的游戏状态

Pol*_*hic 4 unreal-engine4

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

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

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

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

ps 我正在研究简单的单人游戏案例。

Dou*_*son 5

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

当在编辑器实用程序小部件中使用“获取游戏状态”节点时,会暴露“世​​界上下文对象”引脚。

获取小部件蓝图中的游戏状态节点

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

获取 Actor 蓝图中的游戏状态节点

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

另一方面,您的编辑器窗口小部件蓝图没有与可用作World Context Object 的对象绑定的对象,因此您必须以某种方式提供一个对象。

使用蓝图中选定的 Actor

下面是如何使用选定的 actor 作为World Context Object来获取 Game State 的示例。要使用此示例,请创建一个带有单个按钮的编辑器实用程序蓝图,并使用下面的蓝图图作为按钮单击处理程序。然后运行该小部件,并在编辑器中启动“播放”,然后释放播放器 (F8),选择场景中的任何演员,然后单击按钮。您应该会看到记录的当前时间。

在编辑器实用程序小部件蓝图中使用获取游戏状态

使用C++

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

.h 文件

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

public:

    UFUNCTION(BlueprintCallable)
    static UWorld* MyGetWorld();

};

Run Code Online (Sandbox Code Playgroud)

.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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,对于此示例,我将函数置于游戏模式中,这可能不是您组织放置的位置,但这只是为了演示,因为当您从 Basic 创建新的 C++ 项目时,会自动创建游戏模式 C++ 文件。模板。

另请注意,您尝试做的事情有点粗略。编辑器实用程序旨在在编辑器的上下文中运行,它可以承受许多世界的加载。如果您希望能够按下与场景交互的按钮,您最好执行以下操作之一:

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