UE4 使用actor实现截图并保存(C++实现)
时间: 2024-01-28 19:03:21 浏览: 95
在UE4中,你可以通过将截图功能封装成一个Actor来实现。以下是一个简单的C++实现:
1. 创建一个新的Actor,例如 "ScreenshotActor"。
2. 在 "ScreenshotActor" Blueprint 中添加一个函数,例如 "TakeScreenshot"。
3. 在 "ScreenshotActor" 的 C++ 代码中实现 "TakeScreenshot" 函数,如下所示:
```cpp
void AScreenshotActor::TakeScreenshot()
{
// Get the player controller
APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);
if (!PlayerController)
{
return;
}
// Take the screenshot
FViewport* Viewport = GEngine->GameViewport->Viewport;
TArray<FColor> Bitmap;
bool bScreenshotSuccessful = Viewport->ReadPixels(Bitmap, FReadSurfaceDataFlags(), FIntRect(0, 0, Viewport->GetSizeXY().X, Viewport->GetSizeXY().Y));
if (!bScreenshotSuccessful)
{
return;
}
// Create the texture
UTexture2D* Texture = UTexture2D::CreateTransient(Viewport->GetSizeXY().X, Viewport->GetSizeXY().Y, PF_B8G8R8A8);
Texture->AddToRoot(); // Make sure the texture isn't garbage collected
Texture->UpdateResource();
// Copy the bitmap data to the texture
uint8* MipData = static_cast<uint8*>(Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE));
for (int32 Y = 0; Y < Viewport->GetSizeXY().Y; Y++)
{
for (int32 X = 0; X < Viewport->GetSizeXY().X; X++)
{
int32 Index = Y * Viewport->GetSizeXY().X + X;
MipData[Index * 4 + 0] = Bitmap[Index].B;
MipData[Index * 4 + 1] = Bitmap[Index].G;
MipData[Index * 4 + 2] = Bitmap[Index].R;
MipData[Index * 4 + 3] = Bitmap[Index].A;
}
}
Texture->PlatformData->Mips[0].BulkData.Unlock();
// Save the texture to a file
FString Filename = FPaths::ProjectDir() / TEXT("Screenshots") / FDateTime::Now().ToString(TEXT("yyyy-MM-dd_HH-mm-ss")) + TEXT(".png");
FFileHelper::SaveObjectAsPNG(Texture, *Filename);
// Clean up
Texture->RemoveFromRoot();
}
```
4. 在 "ScreenshotActor" Blueprint 中添加一个触发器或其他交互方式来触发 "TakeScreenshot" 函数。
此代码与前面的代码类似,但使用了 GetWorld() 函数来获取当前世界的引用,而不是使用传递给函数的 WorldContextObject 参数。
注意:在使用此代码之前,请确保在项目设置中启用 "With Editor" 选项,以便在运行时允许截屏。
阅读全文