【问题标题】:Get game state inside Editor Widget in Unreal Engine 4在虚幻引擎 4 的编辑器小部件中获取游戏状态
【发布时间】:2020-02-23 05:31:02
【问题描述】:

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

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

我知道当我没有在编辑器中点击播放时这是正确的(没有游戏状态实例)。但是一旦我点击播放,当我点击编辑器小部件上的按钮时,一切都一样——它返回 null。同时,游戏窗口内的常规小部件确实返回游戏状态参考。

那么,假设游戏正在玩(我点击 Play 按钮),如何访问 Editor Widget 中的 Game State(就像在普通 Widget 中一样)?

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

【问题讨论】:

    标签: unreal-engine4


    【解决方案1】:

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

    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++)。

    【讨论】:

      猜你喜欢
      • 2020-09-01
      • 2020-10-02
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多