我有一个编辑器小部件,并且在其中创建了一些按钮单击事件的蓝图。
不幸的是,当我使用“获取游戏状态”节点(或任何类似节点)时,它始终返回null。
我了解到我没有在编辑器中点击“播放”(没有游戏状态实例)是正确的。但是一旦点击Play,当我单击Editor Widget上的按钮时,它们都是一样的-它返回null。同时,游戏窗口中的常规小部件确实会返回游戏状态引用。
那么,假设游戏正在玩(我按下“播放”按钮),如何访问编辑器小部件内的游戏状态(就像在普通小部件中一样)?
p.s。我正在研究简单的单人游戏情况。
答案 0 :(得分:2)
在Editor Utility Widget内使用获取游戏状态节点时,世界上下文对象引脚会暴露。
在“ Actor蓝图”中,世界上下文对象仍然存在,但是编辑器隐藏了该图钉,因为它可以自动确定。
世界上下文对象是可以返回到UObject
对象的任何UWorld
。对于Actor蓝图,通过将那个actor传递到GetWorldFromContextObject
,蓝图编辑器可以简单地将该actor用作 World Context Object 。
您的编辑器窗口小部件蓝图没有与可以用作世界上下文对象的对象绑定的对象,因此您必须以某种方式提供一个。
这里是如何使用所选角色作为世界上下文对象来获取游戏状态的示例。要使用此示例,请创建一个带有单个按钮的Editor Utility Blueprint,并将下面的Blueprint图用作按钮单击处理程序。然后运行该小部件,并启动“在编辑器中播放”,然后放置播放器(F8),选择场景中的任何演员,然后单击按钮。您应该会看到当前记录的时间。
或者,您可以创建一个Blueprint可调用的C ++函数,该函数直接循环遍历引擎的世界,并将最合适的函数返回给Blueprints。
UCLASS()
class MYPROJECT_API AMyProjectGameModeBase : public AGameModeBase
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
static UWorld* MyGetWorld();
};
#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 ++文件来自基本模板。
还请注意,您尝试执行的操作有点粗略。编辑器实用程序是要在编辑器的上下文中运行的,它可以在加载许多世界后幸免于难。如果您希望能够按下与场景交互的按钮,则最好执行以下操作之一: