你必须有一个有效的世界上下文对象。
当 Get Game State 节点在 Editor Utility Widget 中使用时,World Context Object 引脚被暴露。
在 Actor 蓝图中,World Context Object 仍然存在,但编辑器隐藏了 pin,因为它可以自动确定。
世界上下文对象是可以返回到UWorld 对象的任何UObject。对于 Actor 蓝图,蓝图编辑器可以简单地将该 Actor 用作 World Context Object,只需将该 Actor 传递给 GetWorldFromContextObject。
另一方面,您的编辑器控件蓝图没有与可用作世界上下文对象的对象绑定的对象,因此您必须以某种方式提供一个。
使用从蓝图中选择的 Actor
这里是一个示例,说明如何使用选定的actor作为世界上下文对象来获取游戏状态。要使用此示例,请创建一个带有单个按钮的编辑器实用程序蓝图,并将下面的蓝图图表用作按钮单击处理程序。然后运行小部件,并开始在编辑器中播放,然后释放播放器 (F8),选择场景中的任何演员,然后单击按钮。您应该会看到记录的当前时间。
使用 C++
或者,您可以创建一个蓝图可调用 C++ 函数,该函数直接循环通过引擎的世界并将最合适的世界返回给蓝图。
.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++,我从未在蓝图中尝试过)
- 如果这仅适用于特定类型的参与者,请为该参与者创建一个自定义详细信息面板(需要 C++)。