minuschki Geschrieben 29. September 2019 Melden Share Geschrieben 29. September 2019 Hallo zusammen Ich habe das folgende Script mit einem Button verknüpft. Sobald dieser gedrückt wird, soll ein Screenshot von einem rechteckigen Bereich (280, 0, 400, 400) meiner MainCamera gemacht werden und im angegebenen Ordner gespeichert werden. Problem: Es wird zwar ein PNG-Bild in der Grösse 400 x 400 im gewünschten Ordner abgelegt, aber dieses ist einfach nur komplett schwarz. Mit dem Befehl ScreenCapture hat das noch ganz gut geklappt, aber ich möchte eben nur einen bestimmten Bereich als Bild speichern und nicht den ganzen Screen. Vielleicht kann jemand von euch Profis den Code so ändern, dass er funktioniert. Danke für eure Hilfe! using System.Collections; using System.Collections.Generic; using UnityEngine; public class screenshot : MonoBehaviour { string a_Path; public void shot () { var tex = new Texture2D(400, 400, TextureFormat.RGB24, false); tex.ReadPixels(new Rect(280, 0, 400, 400), 0, 0); tex.Apply(); var bytes = tex.EncodeToPNG(); Destroy(tex); a_Path = System.IO.Directory.GetCurrentDirectory() + "/Screenshots/"; var nameScreenshot = "Screenshot " + System.DateTime.Now.ToString("dd-MM-yyyy HH-mm-ss") + ".png"; System.IO.File.WriteAllBytes(a_Path + nameScreenshot, bytes); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
devandart Geschrieben 30. September 2019 Melden Share Geschrieben 30. September 2019 Schaue mal hier in der Antwort, ich nutze für sowas eine RenderTexture, in welche die Kamera den Render schreibt und ich meine, dass dies auch nötig ist. https://answers.unity.com/questions/22954/how-to-save-a-picture-take-screenshot-from-a-camer.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 30. September 2019 Autor Melden Share Geschrieben 30. September 2019 Hallo devandart Danke für deine Hilfe! Ich habe dein vorgeschlagenes Script durch meines ersetzt, erhalte aber Fehlermeldungen (camera.targetTexture und camera.Render werden nicht akzeptiert). Da ich Anfänger bin und gerade erst C# erlerne, habe ich leider keine Ahnung, wie man das beheben kann! Ich wäre dir sehr dankbar, wenn du entweder den oben geposteten Code funktionstüchtig ändern könntest oder die Fehlemeldungen im unteren Script beheben könntest! Sorry für die Umstände! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
devandart Geschrieben 1. Oktober 2019 Melden Share Geschrieben 1. Oktober 2019 Das passiert, weil Du keine Variable vom Typ Camera in deiner Klasse hast. Du musst also entweder die Main Camera nehmen, oder die Kamera im Inspector der Komponente zuweisen. //im Inspector zuweisen [SerializeField] private Camera screenshotCamera; //und unten dann screenshotCamera.Render(); //usw... //Main Camera nutzen z.B. camera.Render() ersetzen durch Camera.main.Render(); Du kannst übrigens Code mit dem Code-Tag in deinen Post einbetten, dann kann man den auch direkt kopieren und korrigiert posten. Ich hoffe, das hilft dir. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 27. Oktober 2019 Autor Melden Share Geschrieben 27. Oktober 2019 Hallo devandart Besten Dank für deine Hilfe! Und es hat auch endlich geklappt. Im untenstehenden Code musste ich lediglich "byte[] bytes" durch "var bytes" ersetzen. Das Gute ist auch, dass auf dem Screenshot die UI Menuelemente gar nicht sichtbar sind. using System.Collections; using System.Collections.Generic; using UnityEngine; public class screenshot : MonoBehaviour { string a_Path; public void shot () { Debug.Log ("Bild wurde gesichert!"); a_Path = System.IO.Directory.GetCurrentDirectory() + "/Screenshots/"; RenderTexture tex = new RenderTexture(1600, 1600, 24); Camera.main.targetTexture = tex; Texture2D screenShot = new Texture2D(1600, 1600, TextureFormat.RGB24, false); Camera.main.Render(); RenderTexture.active = tex; screenShot.ReadPixels(new Rect(0, 0, 1600, 1600), 0, 0); Camera.main.targetTexture = null; RenderTexture.active = null; Destroy(tex); var bytes = screenShot.EncodeToJPG(100); var nameScreenshot = "Screenshot " + System.DateTime.Now.ToString("dd-MM-yyyy HH-mm-ss") + ".jpg"; System.IO.File.WriteAllBytes(a_Path + nameScreenshot, bytes); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.