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