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

这篇具有很好参考价值的文章主要介绍了简单游戏截图_可控截取内容2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一个需求

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

如何做

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

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

  1. 首先给游戏对象分好类
简单游戏截图_可控截取内容2,游戏
  1. 简单设计一下UI,截图功能会在此操作,截图会在此展示
简单游戏截图_可控截取内容2,游戏
三个相加分别是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 ) ; } } }
简单游戏截图_可控截取内容2,游戏
用这样的方式在AR里也可以实现拍照的功能 可以切换截取的是现实的或虚拟加现实的等

文章来源地址https://www.toymoban.com/news/detail-635586.html

到了这里,关于简单游戏截图_可控截取内容2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js中截取字符串里=后的内容、括号间内容

    lastIndexOf()方法可以返回某个子字符串在字符串中最后出现的位置。 var reg1 = /((.+?))/g; // () 小括号 var reg2 = /[(.+?)]/g; // [] 中括号 var reg3 = /{(.+?)}/g; // {} 花括号,大括号 var reg4 = /((.+?))/g; //() 中文小括号 var reg5 = /【(.+?)】/g; // 【】中文中括号 示例截取中括号间的内容:

    2024年02月15日
    浏览(32)
  • JavaScript丨使用正则截取字符串内容

    参考来源: JS 正则截取字符串 - 义美-小义 - 博客园 js正则去除双引号和斜杠_周达的博客-CSDN博客_js去掉斜杠 js将字符串中所有反斜杠替换成正斜杠/_Name is Q的博客-CSDN博客_js字符串替换斜杠

    2024年02月10日
    浏览(23)
  • 帝国cms内容简介截取字数的实现方法

    首先帝国cms在添加文章时没有输入内容简介,则会自动截取部分正文内容作为内容简介,截取的文字数量在系统设置——信息设置——信息简介截取中设置。 当文章内容已经有了简介但是又不想全部调用出来时,可以截取部分简介内容,有以下几个地方: 主要就是使用了e

    2024年02月03日
    浏览(31)
  • 截取一个字符串里括号内的内容

    截取一个字符串里括号内的内容并输出(括号不会嵌套,只需要找到第一对括号即可) 示例: 示例1: hello,(world) 输出:world 示例2:system.crash(error: 100) and will done 输出:error: 100 Pattern pattern = Pattern.compile(“(?=()[^)]+”);是获取所有小括号里面的内容 输出结果:

    2024年02月11日
    浏览(29)
  • 使用 ffmpeg 截取视频的某一个时间段内容

    使用 ffmpeg 截取视频的某一个时间段,可以结合以下3个选项: 使用 -ss 选项指定需要截取的开始时间,结合 -to 或者 -t。 to 指定结束的时间点,以下命令将截取视频文件 input.mp4 从 00:00:05.000 开始,到 00:00:15.000 结束这一段视频。 t 指定持续时间,以下命令将截取视频文件 in

    2024年02月05日
    浏览(35)
  • React Native从文本内容尾部截取显示省略号

    参考链接: https://www.reactnative.cn/docs/text#ellipsizemode https://chat.xutongbao.top/

    2024年02月14日
    浏览(35)
  • 关于使用uniapp截图APP内容的两种办法,及一种小程序原生的截图办法

    方法一 html2canvas 方法二 播放视频时截图 方法三 小程序原生使用的截图

    2024年02月13日
    浏览(28)
  • SQL语句截取字段某指定字符的前半段/后半段内容

    最近项目中遇到一个小问题: 需要从数据库中取出对应数据,并根据某个字段中的前半段内容进行排序,搜索资料后得以解决,现将解决方法记录如下: 最初的查询SQL: 结果截图: 截取file_name字段中前半段数据的SQL: 结果截图: 按照截取的file_name字段的前半段数据及sor

    2024年02月02日
    浏览(23)
  • 第78讲:截取MySQL Binlog二进制日志中特定部分内容的技巧

    我们通过Binlog二进制日志恢复数据时,一般都会先用备份恢复全库的数据,然后再使用Binlog恢复备份中不存在的数据,因此再使用Binlog进行数据恢复时,并不是直接恢复整个Binlog日志中的数据,只是恢复Binlog中的部分数据。 根据特定的情况以及需求去恢复Binlog日志中的数据时

    2024年02月03日
    浏览(38)
  • 简单但好用:4种Selenium截图方法了解一下

    前言 我们执行UI自动化操作时,大多数时间都是不在现场的,出现错误时,没有办法第一时间查看到,这时我们可以通过截图当时出错的场景保存下来,后面进行查看报错的原因, Selenium 中提供了几种截图的方法,小编今天给大家介绍下。 方法一 get_screenshot_as_base64()整个函

    2024年02月05日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包