当前位置: 首页 > news >正文

简单游戏截图_可控截取内容2

一个需求

我需要在场景中截取不同层级的截图(如只截模型或只截UI或只截外部相加看到的画面 或全都截或和Shader配合呈现人眼夜视仪热成像的画面切换)
将截图排到列表中,在场景UI中展示出来

如何做

  1. 相机要能够看到不同的画面
  2. 将当前帧画面存储下来
  3. 将存储的画面展示出来
知识点代码
https://developer.unity.cn/projects/64ca2cbbedbc2a00187ba6d6
下面继续

做一个练习 截屏细节 轮廓+UI 全部三张图分别展示出来

  1. 首先给游戏对象分好类
  1. 简单设计一下UI,截图功能会在此操作,截图会在此展示
三个相加分别是Main 场景的主相机,DesktopUI界面UI专门展示的相机, CamTexture专门用来截图操作的相机平时不打开,只在截图时候打开截这个相机渲染的画面
  1. CamTexture想要渲染不同的画面就要对他进行不同的设置
    
publicclassCtrlScreenShot:MonoBehaviour{//相机渲染[Header("可用渲染内容的相机")]publicCameracameraToChange;[Header("具体渲染的Layers")]publicLayerMaskCullingLayers0;publicLayerMaskCullingLayers1;publicLayerMaskCullingLayers2;// 照片存储的位置publicTransformPhotenRoot;//截图的大小模板(在场景中透明显示就行,为的就是截图时候按照这个UI的大小去截图)publicRectTransformUIRect;//LayerMaskCullingLayers;TransformphotenPos;stringphotenName;publicvoidCtrlScreenShotBtFc(intbutint){switch(butint){case0:CullingLayers =CullingLayers0;//相机渲染显示的LayersphotenPos =PhotenRoot.GetChild(0).transform;//截图显示的位置break;case1:CullingLayers =CullingLayers1;//相机渲染显示的LayersphotenPos =PhotenRoot.GetChild(1).transform;//截图显示的位置break;case2:CullingLayers =CullingLayers2;//相机渲染显示的LayersphotenPos =PhotenRoot.GetChild(2).transform;//截图显示的位置break;default:break;}StartCoroutine(StartScreenShot());}///IEnumeratorStartScreenShot(){cameraToChange.cullingMask =0;//全部剔除cameraToChange.cullingMask =CullingLayers;//显示选择的LayerscameraToChange.gameObject.SetActive(true);photenName =System.DateTime.Now.ToString("yyyyMMddHHmmss")+".png";//截图的名字stringfileName =Application.dataPath +"/StreamingAssets/"+photenName;//系统不识别标点符号,但支持中文yieldreturnStartCoroutine(CaptureByUI(UIRect,fileName));// 拼接图片路径stringimagePath =System.IO.Path.Combine(Application.streamingAssetsPath,photenName);// 开始协程加载图片yieldreturnStartCoroutine(LoadImage(imagePath,photenPos));cameraToChange.gameObject.SetActive(false);}/// <summary>/// 保存截图,并保存成png格式文件/// </summary>/// <param name="UIRect"></param>屏幕截图的大小尺寸规范 是个透明的imageUI/// <param name="mFileName"></param>将截图转换成的png文件保存的位置和命名/// <returns></returns>IEnumeratorCaptureByUI(RectTransformUIRect,stringmFileName){yieldreturnnewWaitForEndOfFrame();//等待当前帧的UI渲染完成//计算截图的宽度和高度intwidth =(int)(UIRect.rect.width);intheight =(int)(UIRect.rect.height);//创建一个新的Texture2D对象,宽度和高度与截图的宽度和高度匹配Texture2Dtex =newTexture2D(width,height,TextureFormat.RGB24,false);//计算从屏幕上读取像素的起始位置floatleftBtmX =UIRect.transform.position.x +UIRect.rect.xMin;floatleftBtmY =UIRect.transform.position.y +UIRect.rect.yMin;//使用tex.ReadPixels()函数从屏幕上读取指定区域的像素,并存储到Texture2D中。tex.ReadPixels(newRect(leftBtmX,leftBtmY,width,height),0,0);//执行读取操作,将修改应用到Texture2D中tex.Apply();//将Texture2D编码为PNG格式的字节数组byte[]bytes =tex.EncodeToPNG();//将字节数组保存为PNG图片文件System.IO.File.WriteAllBytes(mFileName,bytes);}/// <summary>/// 将保存的png,根据名字在界面上相对位置展示出来/// </summary>/// <param name="path"></param>/// <returns></returns>IEnumeratorLoadImage(stringpath,TransformphotenPos){// 发送请求获取图片UnityWebRequestwww =UnityWebRequestTexture.GetTexture(path);yieldreturnwww.SendWebRequest();// 检查请求是否成功if(www.result ==UnityWebRequest.Result.Success){// 获取加载的TextureTexture2Dtexture =DownloadHandlerTexture.GetContent(www);//创建一个RawImage并放在其位置GameObjectuiObject =newGameObject();uiObject.transform.parent =photenPos.transform;RectTransformrectTransform =uiObject.AddComponent<RectTransform>();CanvasRenderercanvasRenderer =uiObject.AddComponent<CanvasRenderer>();RawImagerawImage =uiObject.AddComponent<RawImage>();// 将加载的Texture赋值给RawImage的texture属性rawImage.texture =texture;// 调整RawImage的大小以适应图片的长宽比例rawImage.SetNativeSize();// 获取父级图像的宽度floatparentWidth =rawImage.transform.parent.GetComponent<RectTransform>().rect.width;// 计算图像的长宽比floataspectRatio =(float)rawImage.texture.height /rawImage.texture.width;// 计算应用于图像的新高度floatnewHeight =parentWidth *aspectRatio;// 设置图像的宽度和高度rawImage.rectTransform.sizeDelta =newVector2(parentWidth,newHeight);// 将图像的位置设置为零rawImage.rectTransform.localPosition =Vector3.zero;// 将图像的缩放设置为1rawImage.rectTransform.localScale =Vector3.one;}else{Debug.LogError("Failed to load image: "+www.error);}}}
用这样的方式在AR里也可以实现拍照的功能 可以切换截取的是现实的或虚拟加现实的等

相关文章:

简单游戏截图_可控截取内容2

一个需求 我需要在场景中截取不同层级的截图(如只截模型或只截UI或只截外部相加看到的画面 或全都截或和Shader配合呈现人眼夜视仪热成像的画面切换) 将截图排到列表中&#xff0c;在场景UI中展示出来 如何做 相机要能够看到不同的画面 将当前帧画面存储下来 将存储的画面展示出…...

跨域+四种解决方法

文章目录 一、跨域二、JSONP实现跨域请求三、前端代理实现跨域请求四、后端设置请求头实现跨域请求五、Nginx代理实现跨域请求5.1 安装Nginx软件5.2 使用Ubuntu安装nginx 本文是在学习课程满神yyds后记录的笔记&#xff0c;强烈推荐读者去看此课程。 一、跨域 出于浏览器的同…...

RW-Everything的RwDrv.sys驱动调用

RW-Everything的RwDrv.sys驱动调用 一、RwDrv.sys二、示例代码三、总结 一、RwDrv.sys RW-Everything是一个硬件底层的工具&#xff0c;可用于物理内存、BIOS、PCI和IO端口的查看和修改&#xff0c;其基于驱动RwDrv.sys来实现&#xff0c;利用这个驱动可以实现系统的侵入。 二…...

0101docker mysql8镜像主从复制-运维-mysql

1 概述 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 Mysql支持一台主库同时向多台从库进行复制&#xff0c;从库同时可以…...

uC-OS2 V2.93 STM32L476 移植:系统启动篇

前言 前两篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程&#xff0c;下载了 uC-OS2 V2.93 的源码&#xff0c;并把 uC-OS2 的源文件加入 Keil MDK5 工程 本篇适配 uC-OS2 的 系统定时器&#xff08;Systick&#xff09;与 PendSV_Handler&#xf…...

redis 集群 1:李代桃僵 —— Sentinel

目前我们讲的 Redis 还只是主从方案&#xff0c;最终一致性。读者们可思考过&#xff0c;如果主节点凌晨 3 点突发宕机怎么办&#xff1f;就坐等运维从床上爬起来&#xff0c;然后手工进行从主切换&#xff0c;再通知所有的程序把地址统统改一遍重新上线么&#xff1f;毫无疑问…...

重置 Macbook 中MySQL 的 root 用户密码

Mac上好久前安装测试用的MySQL的Root密码忘记&#xff0c;猜了些常用密码都不对&#xff0c;只能重置密码。 重置密码 1、关闭MySQL服务&#xff0c;可以直接在系统偏好里关闭 sudo /usr/local/mysql/support-files/mysql.server stop 2、进入安装目录&#xff0c;启动安全…...

2308C++搞笑的概念化

前一篇的概念化,太搞笑 元<类 T>概念 可画要求(T&t,整 i){t.画(i);}; 构 方形{空 画(整 i){打印(2*i);} };元<可画 T>空 f(T&t,整 i){t.画(i);t.画(i); }空 主(){方形 e;f(e,33); }用得着那么复杂吗?...

修改node_modules里的源码

最近在工作中使用到一款生成二维码的依赖&#xff08;以vue项目为例讲解&#xff09;&#xff1a;vue-qr&#xff0c;安装的4.0.9版本的&#xff0c;在启动工程的时候报错&#xff1a; You may need an appropriate loader to handle this file type后我查阅各种资料发现 1&a…...

【每日一题Day287】LC24 两两交换链表中的节点 | 模拟 递归

两两交换链表中的节点【LC24】 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 周赛暂停一周啦 思路&#xff1a;模拟 记录前驱…...

Java ~ Collection/Executor ~ PriorityBlockingQueue【源码】

前言 相关系列 《Java ~ Collection【目录】》&#xff08;持续更新&#xff09;《Java ~ Executor【目录】》&#xff08;持续更新&#xff09;《Java ~ Collection/Executor ~ PriorityBlockingQueue【源码】》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;…...

Java后台生成微信小程序码并以流的形式返回给前端

后端代码 获取access_token import net.sf.json.JSONObject;public class WeChatUtil {/*** 获取token*/private static String ACCESSTOKENURL "https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid{appId}&secret{appSecret}"…...

AtcoderABC226场

A - Round decimalsA - Round decimals 题目大意 给定一个实数X&#xff0c;它最多可以使用三位小数表示&#xff0c;而且X的小数点后有三位小数。将X四舍五入到最接近的整数并打印结果。 思路分析 可以使用round函数进行四舍五入 知识点 round(x) 是一个用来对数字进行四…...

Linux知识点 -- VS Code远程连接服务器协助开发

Linux知识点 – VS Code远程连接服务器协助开发 文章目录 Linux知识点 -- VS Code远程连接服务器协助开发一、VS Code的使用1.使用VS Code进行C语言编译与运行2.使用VS Code进行C代码的编译与运行 二、使用VS Code连接云服务器三、使用VS Code进行GDB调试 一、VS Code的使用 1…...

blender基础认识(选项开关、工具栏、视图等)

文章目录 引言一、大纲选项开关和保存启动文件1. 大纲选项1. 禁用选中2. 视图影藏3. 视图禁用4. 渲染禁用 2. 保存启动文件 二、工具栏和侧边栏1. 左侧工具栏2. 右侧工具栏 三、视图1. 视角2. 缩放3. 拖拽4. 摄像机视角5. 切换正交视图6. 局部视图7. 显示隐藏 四、添加删除物体…...

React Hooks 中的属性详解

React Hooks 是 React 16.8 版本中新增的特性&#xff0c;允许我们在不编写 class 的情况下使用 state 和其他的 React 特性。Hooks 是一种可以让你在函数组件中“钩入” React 特性的函数。以下是一些常用的 React Hooks&#xff0c;并附有详细的用法和代码示例。 1. useStat…...

工作遇到问题与解决办法(一)

一、构建父子工程 父 <groupId>com.ruoyi</groupId> <artifactId>ruoyi</artifactId> <version>3.8.5</version> <modules><module>ruoyi-admin</module><module>ruoyi-framework</module><module>…...

综合与新综合与新型交通发展趋势[75页PPT]

导读&#xff1a;原文《综合与新综合与新型交通发展趋势[75页PPT]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需…...

【树形DP+换根思想】2022牛客多校加赛 H

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 这个虽然是树形DP&#xff0c;却用了换根的思想.... 首先&#xff0c;后缀0的个数可以转化成min(cnt2,cnt5)&#xff0c;其中cnt2为2的因子个数&#xff0c;cnt5为5的因子个数 然后进行DP 设dp[u]…...

Gitlab CI/CD笔记-第二天-GitOps的流水线常用关键词(1)

一、常用关键词 在Gitlab项目的根目录需要创建一个 .gitlab-ci.yaml的文件。 这个文件就是定义的流水线。Call :"Pipeline as code" 二、这条流水线怎么写&#xff1f; 一、掌握常用的关键词即可。 1.关键词分类 1.全局关键词 Global Keywards 2.任务关键词…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...