Unity运行时截图作为UI假背景的几种方式

孙广东  2017/4/24

http://blog.csdn.NET/u010019717


主要可以理解为  Unity内截图的几种方式: 

 这三种方式网上很多文章, 但是有些不知道代码具体是怎么实现的


有几种思路:   (我的需求是截图然后作为UI 的假背景使用)

1通过Application.CaptureScreenshot来截图,这种方式最简单,一行代码搞定,缺点也很明显,比如不能选择区域,不能选择图片格式,不能屏蔽某些对象等等;

                  要实现我的需求,只能先保存到本地然后再中本地加载!

 

2通过Texture2D.ReadPixels来读取屏幕区域像素,然后通过EncodeToJPG/EncodeToPNG编码,最后创建文件保存,步骤繁琐,但可控性更高;

     注:这个不知道怎么弄,但是真的很需要这个    偶偶,限制必须要在OnGUI 中才行!      游戏设计 实验笔记中有在OnGUI 中的Demo 但是会有啊!提示不应该放到这里        官方给的例子https://docs.unity3d.com/ScriptReference/Texture2D.ReadPixels.html 是在OnPostRender()  函数中实现的!!!!!

 

  哈哈,找到解决方案了,  在协程中:

    void Start()

    {

        StartCoroutine(CapTexture());

    }

    private void Update()

    {

        if (Input.GetKeyDown(KeyCode.A))

        {

            StartCoroutine(CapTexture());

        }

    }

 

    IEnumerator CapTexture()

    {

       //    关键就是这个等待!!!!!!

        yield return new WaitForEndOfFrame();

 

        Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);

        texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);

        texture.Apply(false, false);

 

        // 最后将这些纹理数据,成一个png图片文件 

        byte[] bytes = texture.EncodeToPNG();

 

        var picName = Application.dataPath + "/" + "新的测试方式偶.png";

 

        System.IO.File.WriteAllBytes(picName, bytes);

 

#if UNITY_EDITOR

        UnityEditor.AssetDatabase.Refresh();

#endif

    }

 

3通过一个RenderTexture渲染相机内容,然后读取RenderTexture的像素,然后用2.2的方式实现截图,可控性更高,可以增加各种效果,可以实现屏蔽等功能;

 // 缺点:  只能得到这个摄像机的内容,  得不到OnGUI 中,  UGUI overlay模式的内容

    Texture2D CaptureCamera(Camera camera, Rect rect)

    {

        // 建一个RenderTexture对象 

        RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 1);

        // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机 

        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;

        //ps: camera2.targetTexture = null; 

        RenderTexture.active = null; // JC: added to avoid errors 

        GameObject.Destroy(rt);

 

 

//=========================保存图片,是非必须的!=============================

        // 最后将这些纹理数据,成一个png图片文件 

        byte[] bytes = screenShot.EncodeToPNG();

 

        // 获取系统时间

        System.DateTime now = new System.DateTime();

        now = System.DateTime.Now;

        string picName = string.Format("image{0}{1}{2}{3}.png", now.Day, now.Hour, now.Minute, now.Second);

 

        picName = Application.dataPath + "/" + picName;

 

        System.IO.File.WriteAllBytes(picName, bytes);

        Debug.Log(string.Format("截屏了一张照片: {0}", picName));

 

#if UNITY_EDITOR

        UnityEditor.AssetDatabase.Refresh();

#endif

//=========================保存图片,是非必须的!=============================

        return screenShot;

    }

 


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值