格小艾 2024-06-06 11:47 采纳率: 0%
浏览 28

UE5用户界面如何静态截图

游戏UI蓝图建立的越来越多,想要把所有UI界面做一个静态快照或截图,进行标记和总览。
问题:怎么在游戏不运行的情况下截图UesrWidget的内容?
HighResShot 只能截取关卡里面的图,我要的是静态的UI内容。

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-06 11:47
    关注

    引自免费微信小程序:皆我百晓生

    在Unreal Engine 5 (UE5) 中,如果你想要在游戏不运行的情况下为User Widget创建一个静态截图,你需要通过编程方式实现。这里有一个步骤指南以及相关的C++代码示例来帮助你完成这个任务。

    首先,确保你已经安装了Unreal Engine 5,并且对C++有一定的了解。接下来按照以下步骤操作:

    1. 创建一个新的C++类,继承自AActor,并命名为ScreenshotActor
    2. ScreenshotActor类中,添加必要的成员变量和函数。
    3. 编写一个函数用于获取屏幕截图。
    4. 使用Unreal Automation Tool运行代码。

    以下是详细的步骤和代码示例:

    步骤1: 创建新的C++类

    在Unreal Engine编辑器中,导航到Content Browser,右键选择"Create | C++ Class"。在弹出的窗口中,选择继承自Actor,然后命名为ScreenshotActor。点击"Next >",然后在下一个窗口中选择保存位置,点击"Finish"。

    步骤2: 添加成员变量和函数

    打开ScreenshotActor.h文件,在private:部分添加一个成员变量:

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Screenshot")
    FTexture2D* ScreenshotTexture;
    

    接着,在public:部分添加一个公共函数:

    UFUNCTION(BlueprintCallable, Category = "Screenshot")
    void TakeScreenshot();
    

    步骤3: 编写TakeScreenshot函数

    打开ScreenshotActor.cpp文件,在里面编写TakeScreenshot函数:

    #include "ScreenshotActor.h"
    #include "Engine/TextureRenderTarget2D.h"
    #include "Engine/SceneCaptureComponent2D.h"
    
    // ...
    
    void AScreenshotActor::TakeScreenshot()
    {
        // 创建一个渲染目标纹理
        UTextureRenderTarget2D* RenderTarget = NewObject<UTextureRenderTarget2D>(this, UTextureRenderTarget2D::StaticClass(), TEXT("ScreenshotRenderTarget"));
        RenderTarget->SetSizeX(1920); // 设置宽度(根据需要调整)
        RenderTarget->SetSizeY(1080); // 设置高度(根据需要调整)
    
        // 创建场景捕捉组件
        USceneCaptureComponent2D* CaptureComponent = CreateDefaultSubobject<USceneCaptureComponent2D>(TEXT("CaptureComponent"));
        CaptureComponent->SetupAttachment(RootComponent);
        CaptureComponent->SetTranslucentMaterial(NULL);
        CaptureComponent->TargetTexture = RenderTarget;
    
        // 开始渲染
        CaptureComponent->BeginRendering();
    
        // 渲染User Widgets
        // 这里需要找到所有的User Widget并将其添加到渲染队列中
        // 注意:这可能需要遍历整个Actor树,找到User Widget并调用其Render函数
    
        // 结束渲染
        CaptureComponent->EndRendering();
    
        // 将渲染结果转换为普通纹理
        FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(RenderTarget).SetWorld(this->GetWorld()));
        FSlateApplication::Get().ProcessAllPendingResourceLoads();
        FSceneView SceneView(ViewFamily);
        SceneView.SetCameraLocationAndRotation(FVector(0, 0, 100), FRotator(0, 0, 0));
        SceneView.Family->UpdateViewports();
    
        // 创建一个新纹理用于保存结果
        UTexture2D* ResultTexture = NewObject<UTexture2D>(this, UTexture2D::StaticClass());
        ResultTexture->CreateSurfaceData2D(FIntPoint(RenderTarget->GetSizeX(), RenderTarget->GetSizeY()), PF_B8G8R8A8, false);
    
        // 将渲染结果复制到新纹理
        GEngine->CopyRenderTargetToTexture(ResultTexture, RenderTarget, &SceneView);
    
        // 更新ScreenshotTexture属性
        ScreenshotTexture = ResultTexture;
    }
    

    在这个函数中,我们创建了一个渲染目标纹理和一个场景捕捉组件。然后开始渲染,遍历User Widget并将它们添加到渲染队列中。最后,我们将渲染结果复制到一个新的纹理中,并更新ScreenshotTexture属性。

    注意,由于User Widget通常是在Game Mode下由引擎自动渲染的,因此直接渲染它们可能会比较复杂。你可能需要遍历整个Actor树,找到User Widget并手动调用其内部的Render函数。这涉及到对Slate库的理解,具体实现可能会因项目而异。

    步骤4: 使用Unreal Automation Tool运行代码

    在命令行工具中,进入项目的Automation目录,执行以下命令来运行你的代码:

    unreal.exe -game -executecommand="runscript /Script/ScreenshotActor.TakeScreenshot()"
    

    这将会执行TakeScreenshot函数,并在ScreenshotActorScreenshotTexture属性中保存截图结果。请注意,这个方法可能不会完美地捕获所有User Widget,因为它们依赖于引擎的渲染机制。你可能需要进一步研究Slate渲染过程,并尝试更深入的方法来捕获这些界面。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月6日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见