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

news2024/11/26 2:41:05

一个需求

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

如何做

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

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

  1. 首先给游戏对象分好类
  1. 简单设计一下UI,截图功能会在此操作,截图会在此展示
三个相加分别是Main 场景的主相机,DesktopUI界面UI专门展示的相机, CamTexture专门用来截图操作的相机平时不打开,只在截图时候打开截这个相机渲染的画面
  1. CamTexture想要渲染不同的画面就要对他进行不同的设置
    
    
public class CtrlScreenShot : MonoBehaviour { //相机渲染 [ Header ( "可用渲染内容的相机" ) ] public Camera cameraToChange ; [ Header ( "具体渲染的Layers" ) ] public LayerMask CullingLayers0 ; public LayerMask CullingLayers1 ; public LayerMask CullingLayers2 ; // 照片存储的位置 public Transform PhotenRoot ; //截图的大小模板(在场景中透明显示就行,为的就是截图时候按照这个UI的大小去截图) public RectTransform UIRect ; // LayerMask CullingLayers ; Transform photenPos ; string photenName ; public void CtrlScreenShotBtFc ( int butint ) { switch ( butint ) { case 0 : CullingLayers = CullingLayers0 ; //相机渲染显示的Layers photenPos = PhotenRoot . GetChild ( 0 ) . transform ; //截图显示的位置 break ; case 1 : CullingLayers = CullingLayers1 ; //相机渲染显示的Layers photenPos = PhotenRoot . GetChild ( 1 ) . transform ; //截图显示的位置 break ; case 2 : CullingLayers = CullingLayers2 ; //相机渲染显示的Layers photenPos = PhotenRoot . GetChild ( 2 ) . transform ; //截图显示的位置 break ; default : break ; } StartCoroutine ( StartScreenShot ( ) ) ; } /// IEnumerator StartScreenShot ( ) { cameraToChange . cullingMask = 0 ; //全部剔除 cameraToChange . cullingMask = CullingLayers ; //显示选择的Layers cameraToChange . gameObject . SetActive ( true ) ; photenName = System . DateTime . Now . ToString ( "yyyyMMddHHmmss" ) + ".png" ; //截图的名字 string fileName = Application . dataPath + "/StreamingAssets/" + photenName ; //系统不识别标点符号,但支持中文 yield return StartCoroutine ( CaptureByUI ( UIRect , fileName ) ) ; // 拼接图片路径 string imagePath = System . IO . Path . Combine ( Application . streamingAssetsPath , photenName ) ; // 开始协程加载图片 yield return StartCoroutine ( LoadImage ( imagePath , photenPos ) ) ; cameraToChange . gameObject . SetActive ( false ) ; } /// <summary> /// 保存截图,并保存成png格式文件 /// </summary> /// <param name="UIRect"></param>屏幕截图的大小尺寸规范 是个透明的imageUI /// <param name="mFileName"></param>将截图转换成的png文件保存的位置和命名 /// <returns></returns> IEnumerator CaptureByUI ( RectTransform UIRect , string mFileName ) { yield return new WaitForEndOfFrame ( ) ; //等待当前帧的UI渲染完成 //计算截图的宽度和高度 int width = ( int ) ( UIRect . rect . width ) ; int height = ( int ) ( UIRect . rect . height ) ; //创建一个新的Texture2D对象,宽度和高度与截图的宽度和高度匹配 Texture2D tex = new Texture2D ( width , height , TextureFormat . RGB24 , false ) ; //计算从屏幕上读取像素的起始位置 float leftBtmX = UIRect . transform . position . x + UIRect . rect . xMin ; float leftBtmY = UIRect . transform . position . y + UIRect . rect . yMin ; //使用tex.ReadPixels()函数从屏幕上读取指定区域的像素,并存储到Texture2D中。 tex . ReadPixels ( new Rect ( 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> IEnumerator LoadImage ( string path , Transform photenPos ) { // 发送请求获取图片 UnityWebRequest www = UnityWebRequestTexture . GetTexture ( path ) ; yield return www . SendWebRequest ( ) ; // 检查请求是否成功 if ( www . result == UnityWebRequest . Result . Success ) { // 获取加载的Texture Texture2D texture = DownloadHandlerTexture . GetContent ( www ) ; //创建一个RawImage并放在其位置 GameObject uiObject = new GameObject ( ) ; uiObject . transform . parent = photenPos . transform ; RectTransform rectTransform = uiObject . AddComponent < RectTransform > ( ) ; CanvasRenderer canvasRenderer = uiObject . AddComponent < CanvasRenderer > ( ) ; RawImage rawImage = uiObject . AddComponent < RawImage > ( ) ; // 将加载的Texture赋值给RawImage的texture属性 rawImage . texture = texture ; // 调整RawImage的大小以适应图片的长宽比例 rawImage . SetNativeSize ( ) ; // 获取父级图像的宽度 float parentWidth = rawImage . transform . parent . GetComponent < RectTransform > ( ) . rect . width ; // 计算图像的长宽比 float aspectRatio = ( float ) rawImage . texture . height / rawImage . texture . width ; // 计算应用于图像的新高度 float newHeight = parentWidth * aspectRatio ; // 设置图像的宽度和高度 rawImage . rectTransform . sizeDelta = new Vector2 ( parentWidth , newHeight ) ; // 将图像的位置设置为零 rawImage . rectTransform . localPosition = Vector3 . zero ; // 将图像的缩放设置为1 rawImage . rectTransform . localScale = Vector3 . one ; } else { Debug . LogError ( "Failed to load image: " + www . error ) ; } } }
用这样的方式在AR里也可以实现拍照的功能 可以切换截取的是现实的或虚拟加现实的等

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

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

相关文章

利用文档管理系统软件实现信息共享与知识沉淀

在当今信息的时代&#xff0c;各个企业和组织面临着大量的信息管理和知识沉淀的问题。为了更好地实现信息共享和知识沉淀&#xff0c;许多企业开始使用文档管理软件&#xff0c;该软件通过整合和管理各种文档&#xff0c;并提供强大的搜索和分享功能&#xff0c;有效促进了信息…

Java容器之Stack和Deque

Java容器之Stack和Deque 目录概述需求&#xff1a; 设计思路实现思路分析1.Java中Deque和Stack都是用于实现栈&#xff08;stack&#xff09;数据结构的类&#xff0c;但它们有一些区别。2.实现方式不同3.用途不同 拓展实现 参考资料和推荐阅读 Survive by day and develop by …

代驾小程序怎么做

代驾小程序是一款专门为用户提供代驾服务的手机应用程序。它具有以下功能&#xff1a; 1. 预约代驾&#xff1a;代驾小程序允许用户在需要代驾服务时提前进行预约。用户可以选择出发地点、目的地以及预计用车时间&#xff0c;系统会自动匹配最合适的代驾司机&#xff0c;并确保…

Ref从入门到入土

首先做个对比&#xff1a; 功能一&#xff1a;引用一个值做持久化记忆 场景&#xff1a;清除定时器 import { useRef } from "react" import { useState } from "react" // ref:1.引用一个值 做持久化记忆 // let num useRef(1) // console.log(num.cur…

Pandaer的iPhone手机壳

哇塞&#xff0c;Pandaer的设计太棒了&#xff01;手机壳的花样多到让我眼花缭乱&#xff0c;好多系列设计都很有意思&#xff0c;让人有集齐的冲动。我最近入手了几个iPhone的手机壳&#xff0c;它有亮色和透明的款式&#xff0c;亮色的壳内部也是亮的&#xff0c;因为手机壳全…

宝塔一键安装包安装魔众XX系统

1 环境安装 1.1 一定先看 在阅读本文档安装系统时&#xff0c;请确保您已经 熟练掌握 如何使用 apache 或 nginx 的进行网站系统的配置方法。 如果您 不是很了解 或 了解甚少&#xff0c;请直接购买我们的 付费安装服务&#xff0c;同时把服务器信息、需要安装的系统源码提供给…

8月1日上课内容 第一章web基础与http协议

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层--传输层---网络层----数据链路层-----物理层 ip地址&#xff0c;我们每一台主机都有一个唯一的地址标识(固定的ip地址)&#xff0c;区分用户和计算机通信。 ip地址:32位二进制数组成的&#xff0c;不方便记忆 192.168.…

Android Ble蓝牙App(三)特性和属性

Ble蓝牙App&#xff08;三&#xff09;特性使用 前言正文一、获取属性列表二、属性适配器三、获取特性名称四、特性适配器五、加载特性六、显示特性和属性七、源码 前言 在上一篇中我们完成了连接和发现服务两个动作&#xff0c;那么再发现服务之后要做什么呢&#xff1f;发现服…

Java循环:探索迭代的世界

文章目录 1. for循环2. while循环3. do-while循环总结 循环是编程中的重要概念&#xff0c;它允许我们重复执行特定的代码块&#xff0c;帮助我们简化复杂的任务和提高代码的效率。在Java中&#xff0c;循环有多种形式&#xff0c;包括for循环、while循环和do-while循环。本篇博…

玩转SWAT模型——最全面SWAT模型教程【建模方法、实例应用、高级进阶】

目录 第一部分&#xff1a;SWAT模型实践部分 第二部分&#xff1a;SWAT模型【进阶部分】 更多推荐 【专家】&#xff1a;刘老师【副教授】&#xff0c;北京重点高校资深专家&#xff0c;和美国SWAT软件开发方长期合作&#xff0c;拥有丰富的科研及工程技术经验&#xff0c;长…

虫情监测仪介绍—技术原理、功能优势是什么?

KH-CQPest虫情监测仪是做好虫情监测的重要设备&#xff0c;利用虫情监测仪能够对农业大田、智慧温室、林业等场景的害虫分布情况及害虫种类进行监测&#xff0c;协助人们制定合理的防治措施。 1.技术原理&#xff1a; KH-CQPest虫情监测仪采用光学诱虫原理&#xff0c;配合传感…

【嵌入式学习笔记】嵌入式入门3——串口USART

1.数据通信的基础概念 1.1.串行/并行通信 数据通信按数据通信方式分类&#xff1a;串行通信、并行通信 1.2.单工/半双工/全双工通信 数据通信按数据传输方向分类&#xff1a;单工通信、半双工通信、全双工通信 单工通信&#xff1a;数据只能沿一个方向传输半双工通信&…

架构训练营学习笔记:6-2 微服务基础选型

基础选型 微服务基础设施架构 优先级 其中&#xff0c;核心 就是服务注册、服务发现、服务路由。 模式1-嵌入SDK 模式2-反向代理式 模式3-网络代理式&#xff08;Service Mesh&#xff09; 模式对比 常见微服务框架选择 嵌入SDK-dubbo Spring Cloud 反向代理式 APISIX …

【Docker】性能测试监控平台搭建:InfluxDB+Grafana+Jmeter+cAdvisor

前言 在做性能测试时&#xff0c;如果有一个性能测试结果实时展示的页面&#xff0c;可以极大的提高我们对系统性能表现的掌握程度&#xff0c;进而提高我们的测试效率。但是我们每次打开Jmeter都会有几个硕大的字提示别用GUI模式进行负载测试&#xff0c;而且它自带的监视器效…

LeetCode-Java(06)

24. 两两交换链表中的节点 非递归解法 class Solution {public ListNode swapPairs(ListNode head) {ListNode pre new ListNode(0);pre.next head;ListNode temp pre;while(temp.next ! null && temp.next.next ! null) {ListNode start temp.next;ListNode end …

指标体系构建与验证

文章目录 知网论文1 本土化计算思维评价指标体系的构建与探索——基于1410名高中生的样本分析与验证2 企业集团人力资源管理质量评价指标体系的构建3 基于知识管理的创新型企业评价指标体系的构建及验证4 中国公民科学素质测评指标体系研究5 中国企业劳动关系评价指标体系的改进…

Linux ❀ Yum源安装RPM包常见问题与解决方法

文章目录 1、Yum源仓库检查2、执行安装报错2.1 RPM包缺失2.2 进程锁定2.3 未完成事务2.4 RPM包冲突 1、Yum源仓库检查 404错误多为yum源无法访问导致&#xff0c;检查yum仓库是否配置正确&#xff0c;同时确认baseurl连通性。 $ cd /etc/yum.repos.d/ $ cat ${yum_file} | gr…

ETHERCAT转PROFIBUS连接到300plc的配置方法

由于捷米JM-DP-ECT&#xff0c;是自主研发的一款PROFIBUS从站功能的通讯网关&#xff0c;它的主要功能是将ETHERCAT设备接入到PROFIBUS网络中生产环境比较复杂有多个设备采用不同的协议这极大的阻碍了&#xff0c;各个设备的数据互通。 JM-DP-ECT这个小小的网关可不简单&#x…

thunder gbm

文章目录 背景参考官网信息训练调参模型保存推理 背景 想在 GPU 上使用使用闪电般快速的提升方法&#xff1f;了解这个库就好了。在很多任务上&#xff0c;它都比 LightGBM 和 XGBoost 快。 ThunderGBM 的主要特征如下&#xff1a; 通常是其它库的 10 倍。 支持 Python&#x…

记一次数据批量插入实践

背景&#xff1a; 2023月7月份入职新公司&#xff0c;初来乍到还没参入到具体的项目中&#xff0c;技术负责人安排写一个批量处理数据的服务&#xff0c;于是便有了以下文章。 数据流程大概是这样&#xff0c;从clickhouse表中获取数据&#xff0c;并从elasticserach中根据业务…