unity指定摄像机截屏并保存(只截UI)

时间:2024-03-15 14:51:34

参考博客:https://blog.csdn.net/anyuanlzh/article/details/17008909

该篇博客博主提供了三种屏幕截屏方式,这里主要针对第三种方式说一下关于摄像机的配置。

由于博主使用的NGUI,NGUI是拥有直接配置好的UICamera,所以可以直接使用,而现在还是有大部分人都是

使用UGUI,而UGUI的默认Camera并没有这样的功能,所以我们需要做一些处理。

首先,右键创建一个新的Camera,命名为UICamera,组件配置如下图:

unity指定摄像机截屏并保存(只截UI)

需要注意的是,我把投影模式设置为正交模式,深度设置为-2,首先投影模式设置成正交是为了更好的对UI进行显示,

深度为-2是因为界面显示我还是主要想让MainCamera显示,UICamera并不出现在屏幕中,只是为了截屏而已,当然

如果你需要它显示在界面中,可以有不同的设置。

 

第二步,创建一个Canvas,我取名为CaptureCanvas

unity指定摄像机截屏并保存(只截UI)

这一步要做的其实就很简单,将渲染模式设置为跟随摄像机,并把相机拖入其中。到这一步,我们可以看看在Scene中的

显示。unity指定摄像机截屏并保存(只截UI)

我们可以明显看到Camra和Canvas的位置,这时可以在Canvas添加需要的图

比如这样:

unity指定摄像机截屏并保存(只截UI)

准备工作已经做完,接下来我们可以加入代码,就是最开始上面的链接,我们主要针对第三种方法:

/// <summary>
/// 对相机截图。 
/// </summary>
/// <returns>The screenshot2.</returns>
/// <param name="camera">Camera.要被截屏的相机</param>
/// <param name="rect">Rect.截屏的区域</param>
Texture2D CaptureCamera(Camera camera, Rect rect) 
{
    // 创建一个RenderTexture对象
    RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
    // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机
    camera.targetTexture = rt;
    camera.Render();
        //ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。
        //ps: camera2.targetTexture = rt;
        //ps: camera2.Render();
        //ps: -------------------------------------------------------------------
 
    // **这个rt, 并从中中读取像素。
    RenderTexture.active = rt;
    Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24,false);
    screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素
    screenShot.Apply();
 
    // 重置相关参数,以使用camera继续在屏幕上显示
    camera.targetTexture = null;
        //ps: camera2.targetTexture = null;
    RenderTexture.active = null; // JC: added to avoid errors
    GameObject.Destroy(rt);
    // 最后将这些纹理数据,成一个png图片文件
    byte[] bytes = screenShot.EncodeToPNG();
    string filename = Application.dataPath + "/Screenshot.png";
    System.IO.File.WriteAllBytes(filename, bytes);
    Debug.Log(string.Format("截屏了一张照片: {0}", filename));
    
    return screenShot;
}

关于参数解释:Camera就传入我们的UICamera,Rect可以直接new Rect(0,0,Scree.width,Screen.heigth)。

这个方法的好处是可以指定相机进行截屏,即可以在不影响MainCamera的情况下在用户看不见的地方截下需要的图保存下来。