Unity中实现截图功能

一:使用Unity自带API

using UnityEngine;
using UnityEngine.UI;

public class ScreenShotTest : MonoBehaviour
{
    public RawImage img;

    private void Update()
    {
        //使用ScreenCapture.CaptureScreenshot
        if (Input.GetKeyDown(KeyCode.A))
        {
            ScreenCapture.CaptureScreenshot(Application.dataPath + "/Resources/Screenshot.jpg");
            img.texture = Resources.Load<Texture>("Screenshot");
        }

        //使用ScreenCapture.CaptureScreenshotAsTexture
        if (Input.GetKeyDown(KeyCode.S))
        {
            img.texture = ScreenCapture.CaptureScreenshotAsTexture(0);
        }

        //使用ScreenCapture.CaptureScreenshotAsTexture
        if (Input.GetKeyDown(KeyCode.D))
        {
            RenderTexture renderTexture = new RenderTexture(720, 1280, 0);
            ScreenCapture.CaptureScreenshotIntoRenderTexture(renderTexture);
            img.texture = renderTexture;
        }
    }
}

经过测试,使用ScreenCapture.CaptureScreenshotAsTexture和ScreenCapture.CaptureScreenshotAsTexture截取的都是整个屏幕,相当于手机的截屏,无法自定义截图区域,作用不大。使用ScreenCapture.CaptureScreenshot会有延迟。


二:通过Texture2D.ReadPixels来读取屏幕区域像素

using UnityEngine;
using System.Collections;
using System;

public class ScreenShotTest : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            StartCoroutine(CaptureByRect());
        }
    }

    private IEnumerator CaptureByRect()
    {
        //等待渲染线程结束
        yield return new WaitForEndOfFrame();
        //初始化Texture2D, 大小可以根据需求更改
        Texture2D mTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
        //读取屏幕像素信息并存储为纹理数据
        mTexture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        //应用
        mTexture.Apply();
        //将图片信息编码为字节信息
        byte[] bytes = mTexture.EncodeToPNG();
        //保存(不能保存为png格式)
        string fileName = DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + ".jpg";
        System.IO.File.WriteAllBytes(Application.streamingAssetsPath + "/ScreenShot/" + fileName, bytes);

        UnityEditor.AssetDatabase.Refresh();
    }
}
发布了161 篇原创文章 · 获赞 353 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/LLLLL__/article/details/105263990