【Unity - 屏幕截图】技术要点

embedded/2024/10/15 19:56:47/

在Unity中想要实现全屏截图或者截取某个对象区域的图片都是可以通过下面的函数进行截取

Texture2D/// <summary>///   <para>Reads the pixels from the current render target (the screen, or a RenderTexture), and writes them to the texture.</para>/// </summary>/// <param name="source">The region of the render target to read from.</param>/// <param name="destX">The horizontal pixel position in the texture to write the pixels to.</param>/// <param name="destY">The vertical pixel position in the texture to write the pixels to.</param>/// <param name="recalculateMipMaps">If this parameter is true, Unity automatically recalculates the mipmaps for the texture after writing the pixel data. Otherwise, Unity does not do this automatically.</param>public void ReadPixels(Rect source, int destX, int destY, [DefaultValue("true")] bool recalculateMipMaps)

Texture2D.ReadPixels() 函数参数可以翻译注释了解用法,比较简单,我下面简单说一下:

source: 读取像素的区域,坐标起点是 左下角,这个要注意

destX: 读取后写入到texture的坐标X

destY: 读取后写入到texture的坐标Y

recalculateMipMaps : 是否重新计算minimaps,逐级渐远纹理,一般都会关闭的,直接False

好,接下来,当你点击截图按钮,调用函数

    public void SaveImage(string path){CoroutineManager.StartMonoCoroutine(SavePng(path));}

开启协程, 我用的是自己封装的管理器,你可以用原装的

然后开始截图操作,然后保存

     private IEnumerator SavePng(string path){//这里一定要等到帧渲染完毕yield return new WaitForEndOfFrame();//截图区域的本地坐标转换成 屏幕坐标var screenPoint = UiConfig.camera.WorldToScreenPoint(m_ScanImage.transform.position);//适配比例float ratio_x = Screen.width / 3662f; //注意这里,一定要加上比例//float ratio_y = Screen.height / 2060f;var imageWidth = m_ScanImage.rectTransform.sizeDelta.x * ratio_x;var imageHeight = m_ScanImage.rectTransform.sizeDelta.y * ratio_x;var t = new Texture2D((int)imageWidth, (int)imageHeight, TextureFormat.RGB24, false);//由于rect参数是从左下角开始读取,而我的m_ScanImage.transform锚点在左上角,所以rect的y值要减去他的高度t.ReadPixels(new Rect(screenPoint.x, screenPoint.y - imageHeight, imageWidth, imageHeight), 0, 0, false);t.Apply();var b = t.EncodeToPNG();if (b != null){File.WriteAllBytes(path, b);}

这里说明一下 3662这个值的来历,看一下Canvas的设置
在这里插入图片描述
我的设计分辨率是4K的 3840 * 2060, 这里选择使用高度适配,宽度做拉伸,根据我电脑显示器的分辨率和Match = 1的比例换算后得出实际的设计分辨率 3662 * 2060 大致是这个

	//适配比例float ratio_x = Screen.width / 3662f; //注意这里,一定要加上比例var imageWidth = m_ScanImage.rectTransform.sizeDelta.x * ratio_x;var imageHeight = m_ScanImage.rectTransform.sizeDelta.y * ratio_x;

这个比例加上以后,你的缩放操作就不会影响截图的范围了

好了,大致的要点就这么多,下面说下 坐标转换 ,这个经常用到

// 本地坐标转屏幕坐标, UiConfig.camera.WorldToScreenPoint(transform.position);  //注意这里使用position//屏幕坐标转本地坐标var b = RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, screenPoint, cam, localPoint);

今天讲的都是比较基础的,温故而知新,祝大家生活工作愉快~!


http://www.ppmy.cn/embedded/128040.html

相关文章

【unity框架开发起步】一些框架开发思维和工具类封装

文章目录 前言一、Editor操作二、快捷导出unity包三、快捷打开存储目录四、封装概率函数五、方法过时六、partial 关键字&#xff0c;拆开合并类七、从数组中随机取⼀个数值并进⾏返回1、实现2、object 类优化3、泛型&#xff0c;结构复⽤利器4、params 关键字优化 八、abstrac…

产品经理或项目经理考PMP,薪资会不会提高?

你要知道一个事情&#xff0c;薪资和证书不是划等号的。没有公司会为你多一个证书而去给你涨薪&#xff0c;人家也不是傻子。想要提高薪资还得看公司的情况&#xff0c;还有你在公司岗位的价值&#xff0c;自己的能力以及工作上做出的成绩&#xff0c;是跟这些挂钩的。找一家前…

成都爱尔李晓峰主任讲解“寒”已至,眼需“养”

温度逐渐走低&#xff0c;寒冷空气的到来带走夏季闷热潮湿&#xff0c;也带走了空气中的水分&#xff0c;环境变得干燥&#xff0c;眼睛水分蒸发加快&#xff0c;十分容易造成眼部不适&#xff0c;干眼患者尤其需要注意&#xff01; 有干眼问题的患者&#xff0c;在这样的天气下…

Python | Leetcode Python题解之第464题我能赢吗

题目&#xff1a; 题解&#xff1a; class Solution:def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool:cachedef dfs(usedNumbers: int, currentTotal: int) -> bool:for i in range(maxChoosableInteger):if (usedNumbers >> i) & 1…

CSS也可以赋一个变量值?是的

声明一个自定义属性&#xff0c;属性名需要以两个减号&#xff08;--&#xff09;开始&#xff0c;属性值则可以是任何有效的CSS值。 /*:root 选择器匹配文档根元素。*/ /*在 HTML 中&#xff0c;根元素始终是 html 元素。*/ /*也就是说&#xff1a;root 表示的是根元素*///声…

HT878T 可任意限幅、内置自适应升压的2x8.0W立体声音频功放

1、特征 可任意配置的限幅功能 -自由配置音频限制幅度&#xff0c;使输出音频信号限制在 固定失真水平内 内置自动限温控制功能 -适应不同散热条件&#xff0c;避免出现过温关断现象 高效自适应G类升压功能&#xff0c;有效延长播放时间 -可调节最大限流值&#xff0c;有效防止…

第六章 RabbitMQ之Work模式

目录 一、介绍 二、Work模式 三、案例演示 3.1. 案例需求 3.2. 案例代码实现 3.2.1. 创建SpringBoot工程 3.2.2. 父工程pom依赖 3.2.3. 生产者pom依赖 3.2.3. 生产者配置文件 3.2.4. 生产者核心代码 3.2.5. 消费者RabbitMQConfig 3.2.6. 消费者pom依赖 3.2.7. 消…

【bug】finalshell向远程主机拖动windows快捷方式导致卡死

finalshell向远程主机拖动windows快捷方式导致卡死 问题描述 如题&#xff0c;作死把桌面的快捷方式拖到了finalshell连接的服务器面板中&#xff0c;导致finalshell没有响应&#xff08;小概率事件&#xff0c;有时会触发&#xff09; 解决 打开任务管理器查看finalshell进…