游戏UI蓝图建立的越来越多,想要把所有UI界面做一个静态快照或截图,进行标记和总览。
问题:怎么在游戏不运行的情况下截图UesrWidget的内容?
HighResShot 只能截取关卡里面的图,我要的是静态的UI内容。
UE5用户界面如何静态截图
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在Unreal Engine 5 (UE5) 中,如果你想要在游戏不运行的情况下为User Widget创建一个静态截图,你需要通过编程方式实现。这里有一个步骤指南以及相关的C++代码示例来帮助你完成这个任务。
首先,确保你已经安装了Unreal Engine 5,并且对C++有一定的了解。接下来按照以下步骤操作:
- 创建一个新的C++类,继承自
AActor
,并命名为ScreenshotActor
。 - 在
ScreenshotActor
类中,添加必要的成员变量和函数。 - 编写一个函数用于获取屏幕截图。
- 使用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
函数,并在ScreenshotActor
的ScreenshotTexture
属性中保存截图结果。请注意,这个方法可能不会完美地捕获所有User Widget,因为它们依赖于引擎的渲染机制。你可能需要进一步研究Slate渲染过程,并尝试更深入的方法来捕获这些界面。解决 无用评论 打赏 举报 编辑记录- 创建一个新的C++类,继承自
悬赏问题
- ¥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局部变量对蓝图不可见