Tutorial de captura de tela do Unity Capture
Nesta postagem, mostrarei como capturar capturas de tela no jogo em Unity.
- Crie um novo script, chame-o de SC_ScreenAPI e cole o código abaixo dentro dele:
SC_ScreenAPI.cs
using UnityEngine;
public static class SC_ScreenAPI
{
/// /// /// If above 0, will make sure that the width and height of the captured image are equal or less than specified. /// Returns a Texture2D. public static Texture2D CaptureScreen(int limitSize = 0)
{
//Create a texture the size of the screen, RGB24 format
int width = Screen.width;
int height = Screen.height;
Texture2D screenshot = new Texture2D(width, height, TextureFormat.RGB24, false);
//Read screen contents into the texture
screenshot.ReadPixels(new Rect(0, 0, width, height), 0, 0);
screenshot.Apply();
if (limitSize > 0)
{
screenshot = ScaleTexture(screenshot, limitSize);
}
return screenshot;
}
static Texture2D ScaleTexture(Texture2D source, int limitSize)
{
int width = source.width;
int height = source.height;
bool resize = false;
if (limitSize > 0)
{
if (width > limitSize || height > limitSize)
{
int newWidth = 0;
int newHeight = 0;
float tmpRatio = (width * 1.000f) / (height * 1.000f);
if (tmpRatio == 1)
{
newWidth = limitSize;
newHeight = limitSize;
}
else
{
if (tmpRatio > 1)
{
newWidth = limitSize;
newHeight = (int)(limitSize / tmpRatio);
}
else
{
newWidth = (int)(limitSize * tmpRatio);
newHeight = limitSize;
}
}
width = newWidth;
height = newHeight;
if(width > 0 && height > 0)
{
resize = true;
}
}
}
if (resize)
{
Texture2D result = new Texture2D(width, height, source.format, true);
Color[] rpixels = result.GetPixels(0);
float incX = (1.0f / (float)width);
float incY = (1.0f / (float)height);
for (int px = 0; px < rpixels.Length; px++)
{
rpixels[px] = source.GetPixelBilinear(incX * ((float)px % width), incY * ((float)Mathf.Floor(px / width)));
}
result.SetPixels(rpixels, 0);
result.Apply();
return result;
}
return source;
}
}
Como usar
- A tela é capturada chamando SC_ScreenAPI.CaptureScreen();, que retorna Texture2D
- Opcionalmente, você pode fornecer um valor limitSize que diminuirá a escala da imagem (se a largura ou altura for maior que o valor limite).
NOTA: Chamando SC_ScreenAPI.CaptureScreen(); precisa ser feito após o final do quadro para evitar erros, então use-o dentro do IEnumerator
SC_ScreenCaptureTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SC_ScreenCaptureTest : MonoBehaviour
{
// Update is called once per frame
void Update()
{
//Press Q to capture screenshot
if (Input.GetKeyDown(KeyCode.Q))
{
StartCoroutine(CaptureScreen());
}
}
IEnumerator CaptureScreen()
{
yield return new WaitForEndOfFrame();
//Here is a captured screenshot
Texture2D screenshot = SC_ScreenAPI.CaptureScreen();
//And here is how you get a byte array of the screenshot, you can use it to save the image locally, upload it to server etc.
byte[] bytes = screenshot.EncodeToPNG();
}
}
- Anexe o SC_ScreenCaptureTest a qualquer objeto na cena e use Q para capturar uma captura de tela.