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 捕获屏幕截图。
推荐文章
Unity FPS 计数器
Zone Controller Pro - Unity Asset Store 包
如何在 Unity 中使用新的 HDRP 水系统
FPC Swimmer - 用于沉浸式水环境的综合 Unity 资产
Ultimate Spawner 2.0 - 改变游戏规则的资产
Unity 的鼠标查找脚本
Weather Maker - 将 Unity 环境提升到新高度