2017-12-14 12 views
0

Ich bin neu in C++. Ich habe Code in C# und PHP geschrieben. Seit ich Unreal Engine verwende, versuche ich C++ zu lernen. Für mein Projekt muss ich einen Screenshot im Spiel machen und es sofort zeigen, damit ich es als Textur bekommen kann.Unreal Engine C++ Schreiben Delegieren OnScreenshotCaptured

ich einen Plan Knoten gemacht, die diese Funktion ruft die ich gemacht habe:

void UMyBlueprintFunctionLibrary::TakeScreenshot() 
{ 
    FScreenshotRequest::RequestScreenshot(true); 

    if (GEngine) 
     GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, "Tried to take screenshot"); 
} 

Wenn ich meine Maus über RequestScreenshot schweben Ich sehe das folgende Pop-up:

„Screenshot aus gelesen werden Speicher durch an den viewsport OnScreenshopCaptured Delegierten abonnieren“

Also das ist, was ich versuche zu tun, aber ich habe keine Ahnung, wie ich das sah: https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/UGameViewportClient/OnScreenshotCaptured/

Kann mir jemand sagen, wie man das implementiert und wie man es implementiert?

Antwort

0

Ich habe eine Alternative, keinen Delegierten, aber FRenderTarget::ReadPixel() zu einem gewissen Puffer Sie zugewiesen, indem Sie Ihre eigene UGameViewportClient Implementierung (erben) und übergeordnete Draw() Funktion.

Ich werde die wesentlichen Codes zeigen, aber nicht abgeschlossen.

void UMyGameViewportClient::Draw(FViewport* Viewport, FCanvas* SceneCanvas) 
{ 
    Super::Draw(Viewport, SceneCanvas); 
    if (any_condition_you_need) { 
     CaptureFrame(); 
    } 
} 

void UMyGameViewportClient::CaptureFrame() 
{ 
    if (!Viewport) { 
     return; 
    } 

    if (ViewportSize.X == 0 || ViewportSize.Y == 0) { 
     return; 
    } 

    ColorBuffer.Empty(); // Declare this in header as TArray<FColor> 

    if (!Viewport->ReadPixels(ColorBuffer, FReadSurfaceDataFlags(), 
          FIntRect(0, 0, ViewportSize.X, ViewportSize.Y))) 
    { 
     return; 
    } 
    SaveThumbnailImage(); 
} 

void UMyGameViewportClient::SaveThumbnailImage() 
{ 
    IImageWrapperModule& wrappermodule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper")); 
    auto wrapper_ptr = wrappermodule.CreateImageWrapper(EImageFormat::PNG); 
    for (int i = 0; i < ColorBuffer.Num(); i++) 
    { 
     auto ptr = &ColorBuffer[i]; 
     auto r = ptr->R; 
     auto b = ptr->B; 
     ptr->R = b; 
     ptr->B = r; 
     ptr->A = 255; 
    } // not necessary, if you like bgra, just change the following function argument to ERGBFormat::BGRA 
    wrapper_ptr->SetRaw(&ColorBuffer[0], ColorBuffer.Num() * 4, 
     ViewportSize.X, ViewportSize.Y, ERGBFormat::RGBA, 8); 
    FFileHelper::SaveArrayToFile(wrapper_ptr->GetCompressed(), *ThumbnailFile); 
} 
+0

Danke, ich werde es mir gleich anschauen – Smokegun

+0

Hmm ich muss wirklich zu einem Delegierten beschreiben – Smokegun

Verwandte Themen