Unity 6.3
0 онлайн 1 гость 3 в системе
Вход

ScreenCapture.CaptureScreenshotIntoRenderTexture

Declaration

public static void CaptureScreenshotIntoRenderTexture(RenderTexture renderTexture);

Параметры

Параметр Описание
renderTexture RenderTexture, который будет заполнен содержимым экрана.

Описание

Записывает скриншот игрового окна в объект RenderTexture.

Этот вариант захвата экрана позволяет считывать пиксели асинхронно с помощью AsyncGPUReadback, что позволяет процессу потреблять меньше времени на основном потоке.

Важно: Для обеспечения надежных результатов, всегда ждите, пока процесс рендеринга кадров завершится, прежде чем вызывать этот метод. Чтобы гарантировать это, вы можете вызвать его из сопутствующей процедуры, которая возвращает WaitForEndOfFrame.

using UnityEngine;
using System.Collections;
using UnityEngine.Rendering;

public class ScreenCaptureIntoRenderTexture : MonoBehaviour { private RenderTexture renderTexture;

IEnumerator Start() { yield return new WaitForEndOfFrame();

renderTexture = new RenderTexture(Screen.width, Screen.height, 0); ScreenCapture.CaptureScreenshotIntoRenderTexture(renderTexture); AsyncGPUReadback.Request(renderTexture, 0, TextureFormat.RGBA32, ReadbackCompleted); }

void ReadbackCompleted(AsyncGPUReadbackRequest request) { // Render texture no longer needed, it has been read back. DestroyImmediate(renderTexture);

using (var imageBytes = request.GetData<byte>()) { // do something with the pixel data. } } }

Чтобы захватить каждый дисплей при использовании нескольких дисплеев, захватите каждый дисплей в конце отображения камеры. Ниже приведен пример, показывающий, как это сделать:

using System.IO;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEngine.Rendering;
using System.Security.Cryptography;

public class CaptureScreen : MonoBehaviour { private Camera cameraToCapture; private RenderTexture renderTexture;

public void CaptureCamera(Camera camera) { cameraToCapture = camera; if (cameraToCapture != null) { if (cameraToCapture.targetDisplay >= Display.displays.Length) { Debug.LogWarning("Invalid targetDisplay index, make sure you have activated the targetDisplay (i.e.: Display.displays[" + cameraToCapture.targetDisplay + "].Activate())."); } else { Camera.onPostRender += OnPostRenderCallback; } } else { Debug.LogWarning("Unable to capture, cameraToCapture is null"); } }

void OnPostRenderCallback(Camera cam) { if (cameraToCapture != null && (cam == cameraToCapture)) { if (cameraToCapture.targetDisplay < Display.displays.Length) { List<DisplayInfo> displayLayout = new List<DisplayInfo>(); Screen.GetDisplayLayout(displayLayout); renderTexture = new RenderTexture( displayLayout[cameraToCapture.targetDisplay].width, displayLayout[cameraToCapture.targetDisplay].height, 0);

ScreenCapture.CaptureScreenshotIntoRenderTexture(renderTexture); AsyncGPUReadback.Request(renderTexture, 0, TextureFormat.RGBA32, ReadbackCompleted);

Debug.Log("Capturing " + cameraToCapture.targetDisplay + " " + displayLayout[cameraToCapture.targetDisplay].width + "x" + displayLayout[cameraToCapture.targetDisplay].height); }

Camera.onPostRender -= OnPostRenderCallback; } }

void ReadbackCompleted(AsyncGPUReadbackRequest request) { DestroyImmediate(renderTexture); using (var imageBytes = request.GetData<byte>()) { byte[] bytes = ImageConversion.EncodeArrayToPNG(imageBytes.ToArray(), UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_UNorm, (uint)request.width, (uint)request.height, 0); File.WriteAllBytes(Application.dataPath + "/../SavedScreen" + cameraToCapture.targetDisplay + ".png", bytes); Debug.Log("Capture done, saved to png"); } } }