unity 截图并且展现在UI中
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; // 截图缩略图 Prefabprivate 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. 更新 UIUpdateScreenshotUI(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; // 截图缩略图 Prefabprivate 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. 清空现有UIforeach (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; // 分帧加载避免卡顿}}
}
相关文章:
unity 截图并且展现在UI中
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; // 显示…...
XHR.readyState详解
XHR.readyState详解 引言 XHR.readyState是XMLHttpRequest对象的一个属性,它反映了当前请求的状态。在Ajax编程中,正确理解和使用XHR.readyState对于调试和确保异步请求的正确执行至关重要。本文将详细介绍XHR.readyState的属性值、含义以及在Ajax请求中的具体应用。 XHR.…...
SQL Server数据库引擎服务启动失败:端口冲突
问题现象: SQL Server 2022 安装完成后,数据库引擎服务无法启动,日志报错 “TCP 端口 1433 已被占用”(ERROR_LOG_SYS_TCP_PORT)。 快速诊断 检测端口占用: # 查看 1433 端口占用情况(需管理员权…...
前端知识点---用正则表达式判断邮箱(javascript)
// 全面的正则(兼容大多数情况) const emailRegex /^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$/;// 或直接使用浏览器内置验证 <input type"email" required>/:正则表达式的起始和结束标志。 ^:匹配字符串的…...
中断管理常用API(四)
一、request_irq(...) request_irq 函数主要用于硬中断相关操作,它的核心作用是把一个中断处理函数和特定的中断号进行绑定。当硬件设备触发该中断号对应的中断时,内核就会调用绑定的中断处理函数,像 irqhandler_func 这类。 此函数在多种硬件…...
RabbitMQ高级特性--重试特性
目录 1.重试配置 2.配置交换机&队列 3.发送消息 4.消费消息 5. 运行程序观察结果 6. 手动确认 注意: 在消息传递过程中, 可能会遇到各种问题, 如网络故障, 服务不可用, 资源不足等, 这些问题可能导致消息处理失败. 为了解决这些问题, RabbitMQ 提供了重试机制, …...
pyspark学习rdd处理数据方法——学习记录
python黑马程序员 """ 文件,按JSON字符串存储 1. 城市按销售额排名 2. 全部城市有哪些商品类别在售卖 3. 上海市有哪些商品类别在售卖 """ from pyspark import SparkConf, SparkContext import os import jsonos.environ[PYSPARK_P…...
C语言入门教程100讲(0)从了解C语言的发展史开始
文章目录 引言1. C语言的起源2. C语言的诞生3. C语言的标准化4. C语言的进一步发展5. C语言的影响与应用6. C语言的未来结语引言 C语言作为一种高效、灵活且具有广泛应用的编程语言,在计算机科学史上占据着举足轻重的地位。它的设计不仅影响了后来的编程语言,也对操作系统、…...
【HTML 基础教程】HTML <head>
HTML <head> 查看在线实例 - 定义了HTML文档的标题"><title> - 定义了HTML文档的标题 使用 <title> 标签定义HTML文档的标题 - 定义了所有链接的URL"><base> - 定义了所有链接的URL 使用 <base> 定义页面中所有链接默认的链接目…...
练习题:111
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 指定文件路径和名称: 定义要写入的内容: 打开文件并写入内容: 异常处理: 输出提示信息: 运行思路 结束语 Python题…...
混合知识表示系统框架python示例
前文我们已经深入学习了框架表示法、产生式规则和一阶谓词逻辑,并对它们进行了深度对比,发现它们在不同的应用场景下各有优缺点。 一阶谓词逻辑适合复杂逻辑推理场景,具有数学定理证明、形式化系统规范的优点;产生式规则适合动态决策系统,支持实时决策(如风控、诊断),规…...
信号集操作函数
目录 一、sigpending函数 功能: 头文件: 函数原型: 函数参数: 返回值: 二、sigemptyset函数 功能: 原型: 参数: 返回值: 三、sigfillset函数 功能…...
学习不同电脑cpu分类及选购指南
关于电脑cpu 一、CPU型号的核心组成与命名规则Intel命名规则:AMD命名规则:5. 后缀:Intel常见后缀及其含义:AMD后缀一些常见的后缀及其含义:二、主流品牌CPU的分类与性能差异三、区分CPU型号的实用方法四、主流品牌CPU对比与选择建议五、选购CPU的注意事项关于不同主流CPU的…...
MATLAB 控制系统设计与仿真 - 30
用极点配置设计伺服系统 方法2-反馈修正 如果我们想只用前馈校正输入,从而达到伺服控制的效果,我们需要很精确的知道系统的参数模型,否则系统输出仍然具有较大的静态误差。 但是如果我们在误差比较器和系统的前馈通道之间插入一个积分器&a…...
Baklib知识中台驱动智能架构升级
构建四库体系驱动架构升级 在数字化转型过程中,企业普遍面临知识资源分散、隐性经验难以沉淀的痛点。Baklib通过构建知识库、案例库、流程库及资源库四层核心体系,为知识中台搭建起结构化基础框架。知识库以AI分类引擎实现文档标签化存储,案…...
IP第一次笔记
一、TCP协议 第0步:如果浏览器和host文件存在域名对应的P地址记录关系 则直接封装HTTP数据报文,如果没有记录则触发DNS解析获 取目标域名对应的P地址 第一步:终端主机想服务器发起TCP三次握手 1.TCP的三次握手 2.传输网页数据 HTTP --应用层…...
计算机三级信息安全部分英文缩写
eip,指令寄存器,用于存放指向下一条将执行指令的指针,即返回地址栈顶指针esp基址指针寄存器EBP,基地址数据执行保护DEP(Data Execute Prevention)技术可以设置内存堆栈区的代码为不可执行状态,从而防范溢出后代码的执行…...
Supplements of My Research Proposal: My Perspectives on the RAG
To build an agent, I think there’re a lot of things that can be considered from humans. For example, how do self-learners learn things? I think 2 sources of knowledge can never be ignored: textbooks and online cources. A question then arise: how do we …...
【安全】nginx防止host头攻击
host攻击 系统上线之前要经过安全测试,安全测试中有这么一项,请求头中的host字段,这个值随便修改之后,响应还可以正常返回,这种这种就是有风险的,是测试不通过的,默认情况下,浏览器地址栏中的URL和请求头中的host字段值的ip和端口(或者是域名)是一样的&a…...
vue3实现router路由
说明: vue3实现router路由 效果图: step1:项目结构 src/ ├── views/ │ ├── Home.vue │ └── User.vue ├── router/ │ └── index.js ├── App.vue └── main.jsstep2:左边路由列表C:\Users\wangrusheng\PycharmProjects\un…...
蓝桥杯省赛 棋盘 3533 二维差分+二维前缀和
传送门 0棋盘 - 蓝桥云课 const int N 2e3 10;int n,m; int a[N][N];void insert(int x11,int y11,int x22,int y22) {a[x11][y11] ;a[x11][y22 1] --;a[x22 1][y11] --;a[x22 1][y22 1] ; }void solve() {cin >> n >> m;for (int i 1;i < m;i ){int x11…...
1500 字节 MTU | 溯源 / 技术权衡 / 应用影响
注:本文为 “MTU 字节” 相关文章合辑。 机翻,未校。 讨论部分,以提交人为分界。 单行只有阿拉伯数字的,为引文转译时对回复的点赞数。 How 1500 bytes became the MTU of the internet 1500 字节是如何成为互联网 MTU 的 Fe…...
智能仪表板DevExpress Dashboard v24.2新版亮点:支持.NET 9
使用DevExpress BI Dashboard,再选择合适的UI元素(图表、数据透视表、数据卡、计量器、地图和网格),删除相应参数、值和序列的数据字段,就可以轻松地为执行主管和商业用户创建有洞察力、信息丰富的、跨平台和设备的决策…...
【数据结构】二叉树的递归
数据结构系列三:二叉树(二) 一、递归的原理 1.全访问 2.主角 3.返回值 4.执等 二、递归的化关系思路 三、递归的方法设计 一、递归的原理 1.全访问 方法里调用方法自己,就会形成调用方法本身的一层一层全新相同的调用,方法的形参设置…...
Optional的stream方法,flatMap, filter应用
Java 8引入的Optional和Stream彻底改变了我们处理空值和集合操作的方式。本文将深入探讨如何将二者结合使用,通过四个核心场景提升代码的健壮性和简洁性。 一、Optional构成的Stream:空值自动过滤 当处理Optional集合时,我们常需要过滤掉空…...
Intellij ider部署python项目教程
自己写了一个python项目【mac电脑】,然后用Intellij ider打开,配置python解释器,然后一运行,一直报错, If this fails your Python may not be configured for Tk ModuleNotFoundError: No module named _tkinter 各…...
Linux进程状态补充(10)
文章目录 前言一、阻塞二、挂起三、运行R四、休眠D五、四个重要概念总结 前言 上篇内容大家看的云里雾里,这实在是正常不过,因为例如 写实拷贝 等一些概念的深层原理我还没有讲解,大家不用紧张,我们继续往下学习就行!&…...
使用ANTLR4解析Yaml,JSON和Latex
文章目录 ANTLR4基本使用**1. 安装 Java 运行时(必需)****2. 安装 ANTLR4 命令行工具****方法一:通过包管理器(推荐)****macOS/Linux (Homebrew)****Windows (Chocolatey)** **方法二:手动安装(…...
基于Python深度学习的鲨鱼识别分类系统
摘要:鲨鱼是海洋环境健康的指标,但受到过度捕捞和数据缺乏的挑战。传统的观察方法成本高昂且难以收集数据,特别是对于具有较大活动范围的物种。论文讨论了如何利用基于媒体的远程监测方法,结合机器学习和自动化技术,来…...
Ruby 简介
Ruby 简介 引言 Ruby 是一种广泛使用的动态、开源的编程语言,自 1995 年由日本程序员 Yukihiro Matsumoto(通称 Matz)设计以来,它以其优雅的语法、强大的库支持和跨平台特性赢得了全球开发者的青睐。本文将详细介绍 Ruby 的起源、特点、应用领域以及它在现代软件开发中的…...
