Unity捕获截图教程
在这篇文章中,我将展示如何在 Unity 中捕获游戏中的屏幕截图。
- 创建 一个新脚本,将其命名为 SC_ScreenAPI,然后将以下代码粘贴到其中:
SC_ScreenAPI.cs
using UnityEngine;
public static class SC_ScreenAPI
{
/// <summary>
/// </summary>
/// <param name="limitSize">If above 0, will make sure that the width and height of the captured image are equal or less than specified.</param>
/// <returns>Returns a Texture2D.</returns>
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;
}
}
如何使用
- 通过调用SC_ScreenAPI.CaptureScreen();来捕获屏幕,它返回Texture2D
- 您可以选择提供 limitSize 值,该值将缩小图像(如果其宽度或高度大于限制值)。
注意:调用 SC_ScreenAPI.CaptureScreen(); 需要在帧结束后完成以避免错误,因此在 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();
}
}
- 将 SC_ScreenCaptureTest 附加到场景中的任何对象,然后使用 Q 捕获屏幕截图。