Unity开发笔记:截取指定位置含有UI的场景截图并输出

这篇具有很好参考价值的文章主要介绍了Unity开发笔记:截取指定位置含有UI的场景截图并输出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习记录整理,自用,也希望能帮助到有相同需求的人。
如果直接截全图:

        string screenshotName = "Assets/Textures/UI/20230803/2.png";
        ScreenCapture.CaptureScreenshot(screenshotName);

截取指定位置含有UI的场景截图:
例如这种情况下只想要中间的:
Unity开发笔记:截取指定位置含有UI的场景截图并输出,unity,笔记,ui

UI所在的Canvas设置为RenderMode.ScreenSpaceCamera并挂载相机,然后设置该相机的渲染RenderTexture并开始render,注意这里渲染是从屏幕中心扩展到四周,也就是说RenderTexture小于屏幕的话只能看到中间部分,然后代码如下,已添加注释。
函数中0、1、2三张图只是为了表明ReadPixels中坐标具体参数细节,可删去。
为了方便,我直接使用我的图片的固定大小500*500,自用可以自行获取所需图片尺寸。

注意

    //电脑上:ReadPixels截取Rect部分内容是以左上角为原点,右方为x轴正向下方为y轴正向
    //安卓手机上:ReadPixels截取Rect部分内容是以左下角为原点,右方为x轴正向上方为y轴正向
    //ReadPixels输出到uiTexture部分内容是以左下角为原点,右方为x轴正向上方为y轴正向
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TextureExporter : MonoBehaviour
{
    public Texture2D textureToExport;
    public string exportPath = "Assets/ExportedImages/";
    public RectTransform uiRectTransform; 
    public Camera mainCamera;
    private void Start()
    {
        ExportUIAsImage(exportPath);
        string screenshotName = "Assets/ExportedImages/5.png";
        ScreenCapture.CaptureScreenshot(screenshotName);
    }
    public void ExportUIAsImage(string path)
    {
        GameObject cameraObj = new GameObject("MyCamera");
        Camera cameraComponent = cameraObj.AddComponent<Camera>();

        // 获取UI元素所在的Canvas组件
        Canvas canvas = uiRectTransform.GetComponentInParent<Canvas>();
        canvas.renderMode = RenderMode.ScreenSpaceCamera;
        canvas.worldCamera = cameraComponent;

        // 获取 UI 的宽度和高度
        float width = 1080;
        float height = 1920;

        // 创建 RenderTexture 来保存 UI 的截屏
        RenderTexture renderTexture = new RenderTexture( 1080,1920, 24);
        Camera mainCamera = cameraComponent;

        // 将 UI 渲染到 RenderTexture 中
        mainCamera.targetTexture = renderTexture;
        mainCamera.Render();

        // 保存当前 RenderTexture 作为激活的 RenderTexture
        RenderTexture currentRT = RenderTexture.active;
        RenderTexture.active = renderTexture;

        // 创建一个新的 Texture2D 来保存截屏数据
        Texture2D uiTexture = new Texture2D((int)width, (int)height, TextureFormat.RGB24, false);
        Texture2D uiTexture1 = new Texture2D(500, 500, TextureFormat.RGB24, false);
        Vector3 localTopLeft = new Vector3(uiRectTransform.rect.xMin, uiRectTransform.rect.yMax, 0f);

        // 将本地坐标转换为屏幕坐标
        Vector3 screenTopLeft = uiRectTransform.TransformPoint(localTopLeft);
        Vector3 screenPoint = cameraComponent.WorldToScreenPoint(screenTopLeft);

        uiTexture1.ReadPixels(new Rect(screenPoint.x, 1920- screenPoint.y, 500, 500), 0, 0);
        uiTexture1.Apply();
        // 将 Texture2D 保存为图片文件
        byte[] imageBytes1 = uiTexture1.EncodeToPNG(); 
        System.IO.File.WriteAllBytes(exportPath + "/4.png", imageBytes1);

        //ReadPixels截取Rect部分内容是以左上角为原点,右方为x轴正向下方为y轴正向
        //ReadPixels输出到uiTexture部分内容是以左下角为原点,右方为x轴正向上方为y轴正向
        uiTexture.ReadPixels(new Rect(0, 0, width, height), 0, 0);

        uiTexture.Apply();
        // 将 Texture2D 保存为图片文件
        byte[]imageBytes = uiTexture.EncodeToPNG(); // 或者使用 EncodeToJPG
        System.IO.File.WriteAllBytes(exportPath + "/0.png", imageBytes);


        uiTexture.ReadPixels(new Rect(0, 0, width-500, height - 500), 0, 0);
        uiTexture.Apply();
        // 将 Texture2D 保存为图片文件
         imageBytes = uiTexture.EncodeToPNG(); 
        System.IO.File.WriteAllBytes(exportPath + "/1.png", imageBytes);

        uiTexture.ReadPixels(new Rect(500, 0, width - 500, height - 500), 0, 0);
        uiTexture.Apply();
        // 将 Texture2D 保存为图片文件
        imageBytes = uiTexture.EncodeToPNG(); // 或者使用 EncodeToJPG
        System.IO.File.WriteAllBytes(exportPath + "/2.png", imageBytes);


        // 清理资源
        mainCamera.targetTexture = null;
        RenderTexture.active = currentRT;
        Destroy(uiTexture);
        Destroy(renderTexture);

        Debug.Log("UI 已导出为图片至:" + exportPath + "/screenshot.png");
    }
};

输出情况:

Unity开发笔记:截取指定位置含有UI的场景截图并输出,unity,笔记,ui
0和5直接签全图效果一样。
0:
Unity开发笔记:截取指定位置含有UI的场景截图并输出,unity,笔记,ui

1:
Unity开发笔记:截取指定位置含有UI的场景截图并输出,unity,笔记,ui

2:
Unity开发笔记:截取指定位置含有UI的场景截图并输出,unity,笔记,ui

4:
Unity开发笔记:截取指定位置含有UI的场景截图并输出,unity,笔记,ui

5:
Unity开发笔记:截取指定位置含有UI的场景截图并输出,unity,笔记,ui文章来源地址https://www.toymoban.com/news/detail-645981.html

到了这里,关于Unity开发笔记:截取指定位置含有UI的场景截图并输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity物体移动至指定位置

    在Unity中,物体的坐标分为 局部坐标 和 世界坐标 。 局部坐标是相对于物体的父对象的坐标系,而世界坐标是相对于场景的整体坐标系。 举个例子 将下面代码挂载到Sphere上 输出结果如下 如果想让物体运动到指定的位置,通常情况下是参考世界坐标系。因为世界坐标系是整

    2024年02月05日
    浏览(35)
  • 23. Unity - 3D游戏开发小计02 --- 动画结束UI、导航网格代理、场景搭建插件(ProGrids,ProBuilder,Polybrush)

    1. 动画结束UI 一个游戏在通过后,都是需要一个界面显示当前游戏已经结束,即需要给游戏添加一个结束的界面,可以做一个简单的游戏结束界面,用一个图片展示: 首先在 层级窗口 添加两层UI中的Image,其中第一层的Image仅作背景,可将其填充颜色设置为纯黑色,第二层的

    2024年02月05日
    浏览(33)
  • unity scrollview滚动到指定的位置

    方法一:通过下标 方法二:原文1 原文2 方法一没测试 这里给方法二增加注释理解 图1 图2 图3 图4

    2024年01月20日
    浏览(32)
  • Unity中拖拽3D物体并放入到指定位置

    1.新建一个cube作为我们用来拖拽的物体:  2.给该cube添加我们刚刚编写的脚本: 3.场景中新建几个cube命名为Taget3D,摆在不同的位置并将这些新的cube传入到ListTartgets中:    4.新建几个Image命名为TargetUI,放在不同的位置并传入到ListUITarget中 : 5.新建两个Button分别对应传入buttonU

    2024年02月11日
    浏览(83)
  • QChart实现ui界面上指定位置饼状图、圆环图的绘制

    近期开发遇上了绘制饼图的需求,笔者前期使用QCustomPlot图形库进行一些图形组件的开发是非常方便的,但是这个库没有实现饼图的绘制,所以后面是使用QChart来实现饼状图的开发。本文主要讲述了使用Qt下的Charts 模块来进行饼图的绘制,并结合Qt Creator里面的示例,在这里编

    2024年02月08日
    浏览(60)
  • 【100个 Unity实用技能】☀️ | Unity UGUI ScrollView滑动到指定位置

    老规矩,先介绍一下 Unity 的科普小知识: Unity 是 实时3D互动内容创作和运营平台 。 包括 游戏开发 、 美术 、 建筑 、 汽车设计 、 影视 在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和

    2024年02月12日
    浏览(27)
  • Unity虚拟相机Cinemachine-实现相机自动移动到指定位置

    介绍两种方法, 第一种使用虚拟相机自带DollyCart和DollyTrack进行设置; 第二种使用时间线Timeline和DollyTrack进行设置 1.首先添加图中三个虚拟相机 2.点击 DollyTrack,添加点,设置轨道 3.调整点的位置,使轨道在相机移动的起点和终点保持平滑 4.设置Dolly Cart,将轨道拖拽到Dolly

    2024年01月25日
    浏览(36)
  • umy-ui —— table检索字段自动滚到指定位置并高亮

    需求:  通过input输入框,输入要查找的数据字段,点击确定可以定位到查找的那行数据、并把改行显示高亮。   实现思路: 安装 umy-ui 和 babel插件:(el-table可直接忽略不安装) main.js中引入: babel.config.js中添加: vue代码实现:    首先: u-table中必须添加的属性: 1. use

    2024年02月12日
    浏览(27)
  • Unity 之transform.LookAt() 调整一个物体的旋转,使其朝向指定的位置

    transform.LookAt 是 Unity 引擎中 Transform 组件的一个方法,用于调整一个物体的旋转,使其朝向指定的位置。通常情况下,它被用来使一个物体(如摄像机、玩家角色等)朝向另一个物体、位置或方向。以下是关于 transform.LookAt 方法的详细介绍: 方法签名: 参数说明: target :要

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包