Unity游戏截屏和另类花屏问题处理

问题:游戏结束,结算后的分享功能截图花屏。
由于屏幕上的UI(显示在最上方的结算数据)和场景(显示在下面一层的桌子)分别属于不同的摄像机渲染出来的,之前截图功能只会读取渲染UI的那个摄像机渲染在屏幕上那一块的像素信息,但是由于屏幕上这一块还渲染显示了桌子,导致读取像素信息不完整或者错误,以至于花屏。
现在也让读取像素信息的文理对象去读取渲染桌子的摄像机渲染的那一块内容,最好根据屏幕上显示的层级顺序来设置读取顺序,例如是UI显示在最上面那么他就最后读取,就此花屏问题解决。

相关代码:

    //利用协程截屏
    IEnumerator ShareScreenShot()
{
    //截图的存储位置
        string folder = TKFrame.TKApplication.StoragePath + "ShareCache/";   
        string filename = folder + "screenshot.jpg";
        //获得渲染UI的摄像机
        GameObject mainSecne3d = GameObject.Find("MainScene3D"); 
        Camera camera = mainSecne3d.transform.Find("UICamera").GetComponent();
        //获取渲染桌子的摄像机(这是新增的,不加这个摄像机参加截屏操作会花屏,渲染的桌子等像素信息会读取不完整,因为读取屏幕上的像素信息时桌子也在那一块屏幕范围内,两个摄像机渲染区域显示在屏幕上的内容重叠)
Camera camera2 = mainSecne3d.transform.Find("MahjongCamera/MahjongCamera").GetComponent();
        //读取屏幕上的像素信息所在的区域
        Rect rect = new Rect(0, 0, 1136, 640);
        //执行截屏操作
        CaptureCamera(camera, camera2, rect);
        //检查保存截图的文件夹里面是否包含这个图片
        while (!FileUtil.IsExistsFile(filename))
        {
          //不包含就等0.05秒
          yield return new WaitForSeconds(0.05f);
        }
        LuaDebug.info("截图位置" + filename);
        //SDK分享截图
        SDKManager.getInstance().sharePictureToFriend(filename);
}
    //正式的截屏操作
    Texture2D CaptureCamera(Camera camera, Camera camera2, Rect rect)
    {
        // 创建一个RenderTexture对象  
        RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
        // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机  

        //加上的第二个相机,可以实现只截图某几个指定的相机一起看到的图像。
        //不加上会出现截图花屏现象  
        camera2.targetTexture = rt;
        camera2.Render();
        camera.targetTexture = rt;
        camera.Render();


        // 激活这个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;
        camera2.targetTexture = null;  
        RenderTexture.active = null; // JC: added to avoid errors  
        GameObject.Destroy(rt);
        // 最后将这些纹理数据,成一个png图片文件  
        byte[] bytes = screenShot.EncodeToJPG();

        string folder = TKFrame.TKApplication.StoragePath + "ShareCache/";
        //如果已经包含了相同文件下的图片那么就删除
        if (FileUtil.IsExistsDirectory(folder))
        {
            FileUtil.DeleteDirectory(folder);
        }
        //创建文件和写入图片文理信息
        FileUtil.CreateDirectory(folder);
        string filename = folder + "screenshot.jpg";
        System.IO.File.WriteAllBytes(filename, bytes);
        //Debug.Log(string.Format("截屏了一张照片: {0}", filename));
        return screenShot;
    }

你可能感兴趣的:(Unity)