Unity截图生成图片 图片生成器 一键生成图片
使用Unity编辑器扩展技术实现快速截图功能
效果:
里面没有什么太难的技术,直接上源码吧
- 注意!代码需要放在Editor文件下才能正常运行
using System;
using UnityEditor;
using UnityEngine;[ExecuteInEditMode]
public class Screenshot : EditorWindow
{int MaxShowSelectGo = 5;//最多显示选中的物体int resWidth = Screen.width * 4;int resHeight = Screen.height * 4;public Camera myCamera;int scale = 1;float delayCreateTime = 0.5f;string path = "";bool showPreview = true;RenderTexture renderTexture;GameObject[] selectGOs;bool isTransparent = true;bool isCaptureMultiple = false;// Add menu item named "My Window" to the Window menu[MenuItem("Tools/图片生成器")]public static void ShowWindow(){//Show existing window instance. If one doesn't exist, make one.EditorWindow editorWindow = EditorWindow.GetWindow(typeof(Screenshot));editorWindow.autoRepaintOnSceneChange = true;editorWindow.Show();editorWindow.title = "图片生成器";}float lastTime;void OnGUI(){EditorGUILayout.LabelField("分辨率", EditorStyles.boldLabel);resWidth = EditorGUILayout.IntField("宽", resWidth);resHeight = EditorGUILayout.IntField("高", resHeight);EditorGUILayout.Space();EditorGUILayout.BeginHorizontal();EditorGUILayout.LabelField("默认设置", EditorStyles.boldLabel);if (GUILayout.Button("使用Game视图的分辨率")){resHeight = (int)Handles.GetMainGameViewSize().y;resWidth = (int)Handles.GetMainGameViewSize().x;}if (GUILayout.Button("使用默认大小。H:1440,W:2560")){resHeight = 1440;resWidth = 2560;scale = 1;}EditorGUILayout.EndHorizontal();EditorGUILayout.Space();scale = EditorGUILayout.IntSlider("尺寸", scale, 1, 15);EditorGUILayout.HelpBox("截图的默认模式是裁剪,所以选择合适的宽度和高度。比例是在不损失质量的情况下倍增或放大渲染的一个因素.", MessageType.None);EditorGUILayout.Space();EditorGUILayout.LabelField("截图分辨率为 " + resWidth * scale + " x " + resHeight * scale + " p", EditorStyles.boldLabel);EditorGUILayout.Space();EditorGUILayout.BeginHorizontal();GUILayout.Label("选择相机", EditorStyles.boldLabel);myCamera = EditorGUILayout.ObjectField(myCamera, typeof(Camera), true, null) as Camera;if (myCamera == null) myCamera = Camera.main;if (myCamera != null) myCamera.clearFlags = CameraClearFlags.SolidColor;isTransparent = EditorGUILayout.Toggle("透明背景", isTransparent);EditorGUILayout.EndHorizontal();EditorGUILayout.HelpBox("选择要捕捉渲染的相机。勾选则背景透明", MessageType.None);EditorGUILayout.Space();isCaptureMultiple = EditorGUILayout.Toggle("一次性捕捉多个物体", isCaptureMultiple);if (isCaptureMultiple){selectGOs = Selection.gameObjects;GUILayout.Label((selectGOs.Length == 0 ? "你还什么都没有选。使用鼠标选中场景中的物体,用Shift或者Ctrl多选。" : "当前选择物体数量:"+ selectGOs.Length), EditorStyles.boldLabel);int ShowSelectGo = 0;foreach (var item in selectGOs){if (ShowSelectGo>=MaxShowSelectGo&& MaxShowSelectGo < selectGOs.Length){GUILayout.Label("......", EditorStyles.boldLabel);break;}GUILayout.Label(item.name, EditorStyles.boldLabel);ShowSelectGo++;}}EditorGUILayout.Space();GUILayout.Label("保存路径", EditorStyles.boldLabel);EditorGUILayout.BeginHorizontal();EditorGUILayout.TextField(path, GUILayout.ExpandWidth(false));if (GUILayout.Button("选择路径", GUILayout.ExpandWidth(false)))path = EditorUtility.SaveFolderPanel("保存图片的路径", path, Application.dataPath);EditorGUILayout.EndHorizontal();EditorGUILayout.HelpBox("选择保存屏幕截图的文件夹", MessageType.None);EditorGUILayout.Space();delayCreateTime = EditorGUILayout.Slider("延时生成时间", delayCreateTime, 0.5f, 5);EditorGUILayout.HelpBox("请注意!时间越短,生成图片出错的概率就越高。建议调整为1", MessageType.None);if (GUILayout.Button("生成", GUILayout.MinHeight(60))){if (path == "") path = EditorUtility.SaveFolderPanel("保存图片的路径", path, Application.dataPath);if (isCaptureMultiple){StartTakeHiResShot();}else{TakeHiResShot();Application.OpenURL("file://" + path);}}EditorGUILayout.Space();EditorGUILayout.BeginHorizontal();if (GUILayout.Button("打开最后一个截图", GUILayout.MaxWidth(160), GUILayout.MinHeight(40))){if (lastScreenshot != ""){Application.OpenURL("file://" + lastScreenshot);Debug.Log("Opening File " + lastScreenshot);}}if (GUILayout.Button("打开截图文件夹", GUILayout.MaxWidth(100), GUILayout.MinHeight(40))){Application.OpenURL("file://" + path);}EditorGUILayout.EndHorizontal();}GameObject go = null;void StartTakeHiResShot(){if (selectGOs.Length==0){EditorUtility.DisplayDialog("提示", "请注意!你没有选择任何物体,这不会生成图片。\n\n请取消勾选'一次性捕捉多个物体'这个选项生成单张图片.", "确定");return;}foreach (var item in selectGOs){item.SetActive(false);}go = null;Take(0,0);//Take(0);}void Take(int index,float delayTime){if (index < selectGOs.Length){if (go != null) go.SetActive(false);selectGOs[index].SetActive(true);go = selectGOs[index];if (delayTime > delayCreateTime){delayTime = 0;TakeHiResShot();index++;}EditorApplication.delayCall += () => { Take(index, delayTime + 0.1f); };}else{Application.OpenURL("file://" + path);}}void Take(int index){if (index < selectGOs.Length){if (go != null) go.SetActive(false);selectGOs[index].SetActive(true);go = selectGOs[index];//EditorApplication.delayCall += () =>//{// TakeHiResShot(() => { Take(index + 1); });//};TakeHiResShot(() =>{Take(index + 1);});}else{Application.OpenURL("file://" + path);}}//private bool takeHiResShot = false;public string lastScreenshot = "";public string ScreenShotName(int width, int height){string strPath = "";strPath = string.Format("{0}/screen_{1}x{2}_{3}.png",path,width, height,System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"));lastScreenshot = strPath;return strPath;}public void TakeHiResShot(Action Callback= null){Debug.Log("采取截图");int resWidthN = resWidth * scale;int resHeightN = resHeight * scale;RenderTexture rt = new RenderTexture(resWidthN, resHeightN, 24);myCamera.targetTexture = rt;TextureFormat tFormat;if (isTransparent)tFormat = TextureFormat.ARGB32;elsetFormat = TextureFormat.RGB24;Texture2D screenShot = new Texture2D(resWidthN, resHeightN, tFormat, false);myCamera.Render();RenderTexture.active = rt;screenShot.ReadPixels(new Rect(0, 0, resWidthN, resHeightN), 0, 0);myCamera.targetTexture = null;RenderTexture.active = null;byte[] bytes = screenShot.EncodeToPNG();string filename = ScreenShotName(resWidthN, resHeightN);System.IO.File.WriteAllBytes(filename, bytes);Debug.Log(string.Format("截图如下: {0}", filename));//Application.OpenURL(filename);Callback?.Invoke();}
}
点击下载Demo
相关文章:
Unity截图生成图片 图片生成器 一键生成图片
使用Unity编辑器扩展技术实现快速截图功能 效果: 里面没有什么太难的技术,直接上源码吧 注意!代码需要放在Editor文件下才能正常运行 using System; using UnityEditor; using UnityEngine;[ExecuteInEditMode] public class Screenshot …...
Matlab图像处理-区域特征
凹凸性 设P是图像子集S中的点,若通过的每条直线只与S相交一次,则称S为发自P的星形,也就是站在P点能看到S的所有点。 满足下列条件之一,称此为凸状的: 1.从S中每点看,S都是星形的; 2.对S中任…...
golang 自动生成文件头
安装koroFileHeader控件 打开首选项,进入设置,配置文件头信息"fileheader.customMade": {"Author": "lmy","Date": "Do not edit", // 文件创建时间(不变)// 文件最后编辑者"LastEditors"…...
Excel中的宏、VBA
一、宏是什么? EXCEL MACRO 是一种记录和播放工具,它仅记录您的 Excel 步骤,并且宏将根据需要播放任意多次。 VBA 宏可自动执行重复任务,从而节省了时间。 这是一段可在 Excel 环境中运行的编程代码,但您无需成为编码…...
2023华为杯数学建模研赛思路分享——最全版本A题深度解析
问题回顾: WLAN网络信道接入机制建模 1. 背景 无线局域网(WLAN, wireless local area network)也即Wi-Fi广泛使用,提供低成本、高吞吐和便利的无线通信服务。基本服务集(BSS, basic service set)是WLAN的…...
【校招VIP】测试方案之测试需求分析
考点介绍: 需求分析就是要弄清楚用户需要的是什么功能,用户会怎样使用系统。这样我们测试的时候才能更加清楚的知道系统该怎么样运行,才能更好的设计测试用例,才能更好的测试。 测试方案之测试需求分析-相关题目及解析内容可点击…...
滚珠螺母的清洁方式
滚珠螺母是一种通过滚珠与螺杆进行螺旋运动转换的机械零件,主要用于控制螺杆的运动轨迹和方向,把原来的滑动摩擦利用滚珠的滚动变成滚动摩擦,因此滚珠螺母的摩擦系数大大降低,从而提高了传动效率,要想滚珠螺母达到预期…...
leetcode做题笔记148. 排序链表
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 思路一:归并排序 c语言解法 struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {struct ListNode* dummyHead malloc(sizeof(struct ListNode));dummyHead…...
多线程学习
并发:交替运行 并行:一起运行 多线程实现方式 继承Thread类 ①自己定义一个类继承Thread public class MyThread extends Thread{public void run(){}} ②重写run方法 public class MyThread extends Thread{public void run(){"重写的内容&…...
软件测试/测试开发丨ChatGPT在测试计划中的应用策略
点此获取更多相关资料 简介 测试计划是指描述了要进行的测试活动的范围、方法、资源和进度的文档。它主要包括测试项、被测特性、测试任务和风险控制等。 所以在使用ChatGPT输出结果之前,我们需要先将文档的内容框架梳理好,以及将内容范围划定好&…...
链表oj3(Leetcode)——相交链表;环形链表
一,相交链表 相交链表(Leetcode) 1.1分析 看到这个我们首先想到的就是一个一个比较他们的值有相等的就是交点,但是如果a1和b2的值就相等呢?所以这个思路不行,第二种就是依次比较链表,但是这…...
nginx反向代理
nginx反向代理8.反向代理8.1 实现http反向代理8.1.1 反向代理配置参数8.1.2 反向代理单台web服务器8.1.2.1 端口号后加"/"8.1.2.2 端口号后不加"/" 8.1.3指定location 实现反向代理,动静分离8.1.4 反向代理实例:缓存功能8.1.4.1 举例 8.1.5 实现…...
基于eBPF的安卓逆向辅助工具——stackplz
前言 stackplz是一款基于eBPF技术实现的追踪工具,目的是辅助安卓native逆向,仅支持64位进程,主要功能如下: hardware breakpoint 基于pref_event实现的硬件断点功能,在断点处可读取寄存器信息,不会被用户…...
十大排序——4.堆排序
前面我们讲了堆,现在我们来看一下队排序。 堆排序的步骤: 首先将一个无序数组建立成一个大顶堆然后,将堆顶的元素和堆低的元素进行交换(即将最大的元素交换的到堆底),缩小并下潜调整堆重复上一步…...
独辟蹊径”之动态切换进程代理IP
前言 项目中遇到这样一个需求,需要动态切换指定进程Sockets5代理IP,目前了解到可通过编写驱动拦截或者劫持LSP实现,LSP劫持不太稳定,驱动无疑是相对较好的解决方案,奈何水平不足便有了这"蹊径"。 初步尝试…...
redis漏洞修复:(CNVD-2019-21763)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、漏洞内容二、镜像准备1.确认镜像版本2.下载镜像 三、配置文件准备1.获取配置文件2.修改配置文件 四、启动redis容器五、修改iptables文件总结 前言 漏扫发…...
手刻 Deep Learning -第壹章-PyTorch入门教学-基础概念与再探线性回归
一、前言 本章会需要 微分、线性回归与矩阵的基本观念 这次我们要来做 PyTorch 的简单教学,我们先从简单的计算与自动导数( auto grad / 微分 )开始,使用优化器与误差计算,然后使用 PyTorch 做线性回归,还有…...
深入学习 Redis - 如何使用 Redis 作缓存?缓存更新策略?使用需要注意哪些问题(工作/重点)
目录 一、Redis 作为缓存 1.1、缓存的基本概念 1.1.1、理解 1.1.2、缓存存什么样的数据?二八定律 1.2、如何使用 redis 作为缓存 1.3、缓存更新策略(redis 内存淘汰机制 / 重点) 1.3.1、定期生成 1.3.2、实时生成 内存淘汰策略&#…...
好用的软件测试框架有哪些?测试框架的作用是什么?
软件测试框架是现代软件开发过程中至关重要的工具,它可以帮助开发团队更加高效地进行测试和验证工作,从而大大提高软件质量和用户体验。 一、好用的软件测试框架 1. Selenium:作为一种开源的自动化测试框架,Selenium具有功能强大…...
PAT 1035 插入与归并
PAT 1035 插入与归并 题目描述思路讲解代码展示 题目描述 思路讲解 分析:先将i指向中间序列中满足从左到右是从小到大顺序的最后一个下标,再将j指向从i1开始,第一个不满足a[j] b[j]的下标,如果j顺利到达了下标n,说明…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
