Unity3d之如何截屏

Unity3d中有时有截屏的需求,那如何截屏呢,代码如下:

    /// <summary>
    /// 截屏
    /// </summary>
    /// <param name="camera">截屏的摄像机</param>
    /// <param name="rect">图片大小</param>
    /// <returns>屏幕快照</returns>
    Texture2D CaptureCamera(Camera camera, Rect rect)
    {
        RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
        RenderTexture originRT = camera.targetTexture;      // 临时把camera中的targetTexture替换掉
        camera.targetTexture = rt;
        camera.RenderDontRestore();                         // 手动渲染
        camera.targetTexture = originRT;

        RenderTexture.active = rt;
        Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height);
        screenShot.ReadPixels(rect, 0, 0);                  // 读取的是 RenderTexture.active 中的像素
        screenShot.Apply();
        GameObject.Destroy(rt);
        RenderTexture.active = null;

        return screenShot;
    }

 如何保存 Texture2D 图片:

    static void SaveImage(Texture2D image, string path)
    {
        byte[] buffer = image.EncodeToPNG();
        File.WriteAllBytes(path, buffer);
    }

 urp管线下,如果base camera挂载了多个overlay camera,那如何截屏呢,可参考如下:

        static IEnumerator CaptureCameraEtor(Camera camera, Rect rect, Action<Texture2D> onCaptured)
        {
            RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
            RenderTexture originRT = camera.targetTexture;      // 临时把camera中的targetTexture替换掉

            camera.targetTexture = rt;
            var camStack = camera.GetUniversalAdditionalCameraData().cameraStack;
            for (int i = 0; i < camStack.Count; i++)
                camStack[i].targetTexture = rt;

            yield return null;
            RenderTexture.active = rt;
            Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height);
            screenShot.ReadPixels(rect, 0, 0);                  // 读取的是 RenderTexture.active 中的像素
            screenShot.Apply();
            GameObject.Destroy(rt);
            RenderTexture.active = null;

            camera.targetTexture = originRT;
            for (int i = 0; i < camStack.Count; i++)
                camStack[i].targetTexture = originRT;

            onCaptured?.Invoke(screenShot);
            Debug.Log("截屏成功!!!");
        }

 

转载请注明出处:http://www.cnblogs.com/jietian331/p/6899725.html

posted @ 2017-05-24 16:42  孤独の巡礼  阅读(2713)  评论(0编辑  收藏  举报