unity 截图并且展现在UI中

news2025/4/1 13:11:24
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Collections.Generic;
using System;
using System.Collections;

public class ScreenshotManager : MonoBehaviour
{
    [Header("UI 设置")]
    public RawImage latestScreenshotDisplay; // 显示最新截图
    public Transform screenshotListContainer; // 存放历史截图的父物体(如 ScrollView Content)
    public GameObject screenshotThumbnailPrefab; // 截图缩略图 Prefab

    private string screenshotFolder;
    private List<Texture2D> screenshotTextures = new List<Texture2D>();

    void Start()
    {
        screenshotFolder = Path.Combine(Application.persistentDataPath, "Screenshots");
        Directory.CreateDirectory(screenshotFolder);

        // 加载之前保存的截图(可选)
        LoadExistingScreenshots();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F1))
        {
            CaptureScreenshot();
        }
    }

    public void CaptureScreenshot()
    {
        StartCoroutine(TakeScreenshotCoroutine());
    }

    private IEnumerator TakeScreenshotCoroutine()
    {
        yield return new WaitForEndOfFrame();

        // 1. 截取屏幕
        Texture2D screenshotTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
        screenshotTexture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        screenshotTexture.Apply();

        // 2. 保存到文件
        string fileName = $"Screenshot_{DateTime.Now:yyyyMMdd_HHmmss}.png";
        string filePath = Path.Combine(screenshotFolder, fileName);
        byte[] bytes = screenshotTexture.EncodeToPNG();
        File.WriteAllBytes(filePath, bytes);

        // 3. 存储到列表
        screenshotTextures.Add(screenshotTexture);

        // 4. 更新 UI
        UpdateScreenshotUI(screenshotTexture);

        Debug.Log($"截图已保存: {filePath}");
    }

    private void UpdateScreenshotUI(Texture2D newScreenshot)
    {
        // 显示最新截图
        if (latestScreenshotDisplay != null)
        {
            latestScreenshotDisplay.texture = newScreenshot;
            latestScreenshotDisplay.SetNativeSize();
        }

        // 添加到历史列表(生成缩略图)
        if (screenshotListContainer != null && screenshotThumbnailPrefab != null)
        {
            GameObject thumbnailObj = Instantiate(screenshotThumbnailPrefab, screenshotListContainer);
            RawImage thumbnailImage = thumbnailObj.GetComponent<RawImage>();
            if (thumbnailImage != null)
            {
                thumbnailImage.texture = newScreenshot;
            }
        }
    }

    // 加载已存在的截图(可选)
    private void LoadExistingScreenshots()
    {
        string[] files = Directory.GetFiles(screenshotFolder, "*.png");
        foreach (string file in files)
        {
            byte[] fileData = File.ReadAllBytes(file);
            Texture2D texture = new Texture2D(2, 2);
            texture.LoadImage(fileData); // 自动调整尺寸
            screenshotTextures.Add(texture);
            UpdateScreenshotUI(texture);
        }
    }
}

创建 ScrollView(用于显示历史截图列表):

右键 Hierarchy → UI → ScrollView。

调整大小,确保能容纳多个缩略图。

创建缩略图 Prefab:

右键 Hierarchy → UI → RawImage(命名为 ScreenshotThumbnail)。

调整大小(如 200x200),并添加 Button 组件(方便点击查看大图)。

将其拖入 Resources 文件夹或直接拖到 screenshotThumbnailPrefab 字段。

配置脚本参数:

latestScreenshotDisplay → 拖入一个 RawImage(用于显示最新截图)。

screenshotListContainer → 拖入 ScrollView/Content。

screenshotThumbnailPrefab → 拖入你的缩略图 Prefab。

在这里插入图片描述
下面代码是可以按下F1不停保存截图,按下A键后一次生成

using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Collections.Generic;
using System;
using System.Collections;
using System.Linq;

public class ScreenshotManager : MonoBehaviour
{
    [Header("UI 设置")]
    public RawImage latestScreenshotDisplay; // 显示最新截图
    public Transform screenshotListContainer; // 存放历史截图的父物体(如 ScrollView Content)
    public GameObject screenshotThumbnailPrefab; // 截图缩略图 Prefab

    private string screenshotFolder;
    private List<string> screenshotPaths = new List<string>(); // 改为存储文件路径

    void Start()
    {
        screenshotFolder = Path.Combine(Application.persistentDataPath, "Screenshots");
        Directory.CreateDirectory(screenshotFolder);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F1))
        {
            CaptureScreenshot();
        }

        if (Input.GetKeyDown(KeyCode.A))
        {
            LoadAllScreenshotsToUI();
        }
    }

    public void CaptureScreenshot()
    {
        StartCoroutine(TakeScreenshotCoroutine());
    }

    private IEnumerator TakeScreenshotCoroutine()
    {
        yield return new WaitForEndOfFrame();

        // 1. 截取屏幕
        Texture2D screenshotTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
        screenshotTexture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        screenshotTexture.Apply();

        // 2. 保存到文件
        string fileName = $"Screenshot_{DateTime.Now:yyyyMMdd_HHmmss}.png";
        string filePath = Path.Combine(screenshotFolder, fileName);
        byte[] bytes = screenshotTexture.EncodeToPNG();
        File.WriteAllBytes(filePath, bytes);

        // 3. 添加到路径列表(不立即显示UI)
        screenshotPaths.Add(filePath);

        // 4. 释放纹理内存
        Destroy(screenshotTexture);

        Debug.Log($"截图已保存: {filePath}");
    }

    private void LoadAllScreenshotsToUI()
    {
        // 1. 清空现有UI
        foreach (Transform child in screenshotListContainer)
        {
            Destroy(child.gameObject);
        }

        // 2. 获取所有截图文件并按时间排序
        var allScreenshots = Directory.GetFiles(screenshotFolder, "*.png")
                                    .OrderBy(f => new FileInfo(f).CreationTime)
                                    .ToList();

        // 3. 加载并显示所有截图
        StartCoroutine(LoadAndDisplayScreenshots(allScreenshots));
    }

    private IEnumerator LoadAndDisplayScreenshots(List<string> paths)
    {
        foreach (string filePath in paths)
        {
            // 1. 加载图片文件
            byte[] fileData = File.ReadAllBytes(filePath);
            Texture2D texture = new Texture2D(2, 2);
            texture.LoadImage(fileData);

            // 2. 创建UI元素
            GameObject thumbnailObj = Instantiate(screenshotThumbnailPrefab, screenshotListContainer);
            RawImage thumbnailImage = thumbnailObj.GetComponent<RawImage>();
            if (thumbnailImage != null)
            {
                thumbnailImage.texture = texture;
            }

            // 3. 如果是最后一个截图,显示在大图预览
            if (paths.Last() == filePath && latestScreenshotDisplay != null)
            {
                latestScreenshotDisplay.texture = texture;
                latestScreenshotDisplay.SetNativeSize();
            }

            yield return null; // 分帧加载避免卡顿
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2324383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中断管理常用API(四)

一、request_irq(...) request_irq 函数主要用于硬中断相关操作&#xff0c;它的核心作用是把一个中断处理函数和特定的中断号进行绑定。当硬件设备触发该中断号对应的中断时&#xff0c;内核就会调用绑定的中断处理函数&#xff0c;像 irqhandler_func 这类。 此函数在多种硬件…

pyspark学习rdd处理数据方法——学习记录

python黑马程序员 """ 文件&#xff0c;按JSON字符串存储 1. 城市按销售额排名 2. 全部城市有哪些商品类别在售卖 3. 上海市有哪些商品类别在售卖 """ from pyspark import SparkConf, SparkContext import os import jsonos.environ[PYSPARK_P…

【HTML 基础教程】HTML <head>

HTML <head> 查看在线实例 - 定义了HTML文档的标题"><title> - 定义了HTML文档的标题 使用 <title> 标签定义HTML文档的标题 - 定义了所有链接的URL"><base> - 定义了所有链接的URL 使用 <base> 定义页面中所有链接默认的链接目…

混合知识表示系统框架python示例

前文我们已经深入学习了框架表示法、产生式规则和一阶谓词逻辑,并对它们进行了深度对比,发现它们在不同的应用场景下各有优缺点。 一阶谓词逻辑适合复杂逻辑推理场景,具有数学定理证明、形式化系统规范的优点;产生式规则适合动态决策系统,支持实时决策(如风控、诊断),规…

MATLAB 控制系统设计与仿真 - 30

用极点配置设计伺服系统 方法2-反馈修正 如果我们想只用前馈校正输入&#xff0c;从而达到伺服控制的效果&#xff0c;我们需要很精确的知道系统的参数模型&#xff0c;否则系统输出仍然具有较大的静态误差。 但是如果我们在误差比较器和系统的前馈通道之间插入一个积分器&a…

Baklib知识中台驱动智能架构升级

构建四库体系驱动架构升级 在数字化转型过程中&#xff0c;企业普遍面临知识资源分散、隐性经验难以沉淀的痛点。Baklib通过构建知识库、案例库、流程库及资源库四层核心体系&#xff0c;为知识中台搭建起结构化基础框架。知识库以AI分类引擎实现文档标签化存储&#xff0c;案…

IP第一次笔记

一、TCP协议 第0步&#xff1a;如果浏览器和host文件存在域名对应的P地址记录关系 则直接封装HTTP数据报文&#xff0c;如果没有记录则触发DNS解析获 取目标域名对应的P地址 第一步&#xff1a;终端主机想服务器发起TCP三次握手 1.TCP的三次握手 2.传输网页数据 HTTP --应用层…

vue3实现router路由

说明&#xff1a; vue3实现router路由 效果图&#xff1a; step1:项目结构 src/ ├── views/ │ ├── Home.vue │ └── User.vue ├── router/ │ └── index.js ├── App.vue └── main.jsstep2:左边路由列表C:\Users\wangrusheng\PycharmProjects\un…

1500 字节 MTU | 溯源 / 技术权衡 / 应用影响

注&#xff1a;本文为 “MTU 字节” 相关文章合辑。 机翻&#xff0c;未校。 讨论部分&#xff0c;以提交人为分界。 单行只有阿拉伯数字的&#xff0c;为引文转译时对回复的点赞数。 How 1500 bytes became the MTU of the internet 1500 字节是如何成为互联网 MTU 的 Fe…

智能仪表板DevExpress Dashboard v24.2新版亮点:支持.NET 9

使用DevExpress BI Dashboard&#xff0c;再选择合适的UI元素&#xff08;图表、数据透视表、数据卡、计量器、地图和网格&#xff09;&#xff0c;删除相应参数、值和序列的数据字段&#xff0c;就可以轻松地为执行主管和商业用户创建有洞察力、信息丰富的、跨平台和设备的决策…

【数据结构】二叉树的递归

数据结构系列三&#xff1a;二叉树(二) 一、递归的原理 1.全访问 2.主角 3.返回值 4.执等 二、递归的化关系思路 三、递归的方法设计 一、递归的原理 1.全访问 方法里调用方法自己&#xff0c;就会形成调用方法本身的一层一层全新相同的调用&#xff0c;方法的形参设置…

Intellij ider部署python项目教程

自己写了一个python项目【mac电脑】&#xff0c;然后用Intellij ider打开&#xff0c;配置python解释器&#xff0c;然后一运行&#xff0c;一直报错&#xff0c; If this fails your Python may not be configured for Tk ModuleNotFoundError: No module named _tkinter 各…

Linux进程状态补充(10)

文章目录 前言一、阻塞二、挂起三、运行R四、休眠D五、四个重要概念总结 前言 上篇内容大家看的云里雾里&#xff0c;这实在是正常不过&#xff0c;因为例如 写实拷贝 等一些概念的深层原理我还没有讲解&#xff0c;大家不用紧张&#xff0c;我们继续往下学习就行&#xff01;&…

基于Python深度学习的鲨鱼识别分类系统

摘要&#xff1a;鲨鱼是海洋环境健康的指标&#xff0c;但受到过度捕捞和数据缺乏的挑战。传统的观察方法成本高昂且难以收集数据&#xff0c;特别是对于具有较大活动范围的物种。论文讨论了如何利用基于媒体的远程监测方法&#xff0c;结合机器学习和自动化技术&#xff0c;来…

EtherNet/IP转ProfiNet协议转换网关驱动西门子PLC与流量计的毫秒级压力同步控制

一、案例背景 汽车涂装线的静电喷涂工艺对压缩空气流量稳定性要求极高。原系统中Alicat流量计与西门子PLC因协议差异无法联动&#xff0c;导致涂料浪费率高达8%。通过JM-EIPM-PN网关实现供气系统与PLC的深度集成。从而实现了EtherNet/IP转ProfiNet的通讯。 二、设备连接与配置…

【力扣刷题|第十七天】0-1 背包 完全背包

目标和 力扣题目网址:目标和 这道题我们先用回溯的思想来做。首先我们设正数和为S&#xff0c;数组和为N&#xff0c;目标值为T&#xff0c;那么S-(N-S)T化简之后可以得S(TN)/2即选择的正数个数为偶数&#xff0c;而且NT也为偶数&#xff0c;那么第一个判断条件我们就有了&…

深度学习处理时间序列(3)

基于常识、不使用机器学习的基准 在开始使用像黑盒子一样的深度学习模型解决温度预测问题之前&#xff0c;我们先尝试一种基于常识的简单方法。它可以作为一种合理性检查&#xff0c;还可以建立一个基准&#xff0c;更高级的机器学习模型需要超越这个基准才能证明其有效性。对…

VectorBT:使用PyTorch+LSTM训练和回测股票模型 进阶二

VectorBT&#xff1a;使用PyTorchLSTM训练和回测股票模型 进阶二 本方案基于LSTM神经网络构建多时间尺度股票收益率预测模型&#xff0c;结合VectorBT进行策略回测。核心原理是通过不同时间窗口&#xff08;5/10/20/30日&#xff09;捕捉股价的短期、中期、长期模式&#xff0c…

蓝桥杯 第十二天 819 递增序列

注意注意&#xff1a;不考虑左上的情况&#xff0c;因为题目给的样例没有 public static int is1(char ch[][],int m,int n){int ans0;for (int i0;i<m;i){//起始点在哪for (int j0;j<n;j){int add1;while(jadd<n){if(ch[i][j]<ch[i][jadd]) ans; //横add;}add1…

【YOLOv11】目标检测任务-实操过程

目录 一、torch环境安装1.1 创建虚拟环境1.2 启动虚拟环境1.3 安装pytorch1.4 验证cuda是否可用 二、yolo模型推理2.1 下载yolo模型2.2 创建模型推理文件2.3 推理结果保存路径 三、labelimg数据标注3.1 安装labelimg3.2 解决浮点数报错3.3 labelimg UI界面介绍3.4 数据标注案例…