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

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

一个需求

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

如何做

  1. 相机要能够看到不同的画面
  2. 将当前帧画面存储下来
  3. 将存储的画面展示出来

实现时需要掌握的知识点

相机要能够看到不同的画面

  1. 将不同的游戏对象分类成不同的Layer
  2. 需要单独设置一个相机x与原相机保持一致,唯独更改它的Rendering->CullingMask 规定它可以看什么不看什么,还有Rendering->Priority层级要高于原相机 (还要关闭它的AudioListener,防止重复)
  3. 通常我们要关掉,只在截图的时候打开它
动态控制摄像机Rendering->CullingMask的方法
    
publicCameracameraToChange;//控制的相机publicLayerMasknewCullingLayers;//选择LayersvoidSetCullingMask(){//显示选择的LayerscameraToChange.cullingMask =newCullingLayers;}voidToggleCullingMask(){// 取反剔除层cameraToChange.cullingMask =~cameraToChange.cullingMask;}voidDisableAllLayers(){//全部剔除cameraToChange.cullingMask =0;}

将画面存储下来

需要输入宽度和高度用于创建Texture2D和截图内容用,有两种方式意思直接输入屏幕存储或创建一个image,常用这个image宽高
    
intwidth =Screen.width;intheight =Screen.height;publicRectTransformUIRect;{//计算截图的宽度和高度intwidth =(int)(UIRect.rect.width);intheight =(int)(UIRect.rect.height);//创建一个新的Texture2D对象,宽度和高度与截图的宽度和高度匹配Texture2Dtex =newTexture2D(width,height,TextureFormat.RGB24,false);}
储存方法
事先要创建出StreamingAssets文件夹
    
publicRectTransformUIRect;publicRawImagerawImage;// 添加一个RawImage对象voidUpdate(){if(Input.GetKeyDown(KeyCode.Q)){stringfileName =Application.dataPath +"/StreamingAssets/"+"12.png";//系统不识别标点符号,但支持中文IEnumeratorcoroutine =CaptureByUI(UIRect,fileName);StartCoroutine(coroutine);}}publicIEnumeratorCaptureByUI(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);}

将存储的画面展示出来

到UnityWebRequest 从给的路径里拿数据
    
publicRawImagerawImage;publicstringimageFileName;voidUpdate(){if(Input.GetKeyDown(KeyCode.W)){// 拼接图片路径stringimagePath =System.IO.Path.Combine(Application.streamingAssetsPath,imageFileName);// 开始协程加载图片StartCoroutine(LoadImage(imagePath));}}IEnumeratorLoadImage(stringpath){// 发送请求获取图片UnityWebRequestwww =UnityWebRequestTexture.GetTexture(path);yieldreturnwww.SendWebRequest();// 检查请求是否成功if(www.result ==UnityWebRequest.Result.Success){// 获取加载的TextureTexture2Dtexture =DownloadHandlerTexture.GetContent(www);// 将加载的Texture赋值给RawImage的texture属性rawImage.texture =texture;// 调整RawImage的大小以适应图片的长宽比例rawImage.SetNativeSize();}else{Debug.LogError("Failed to load image: "+www.error);}}
http://www.lryc.cn/news/111197.html

相关文章:

  • Vue3_02 创建Vue3.0工程
  • Arduino ESP 8266 ESPAsyncWebServer AsyncCallbackJsonWebHandler
  • Source Insight_突出显示对选定字符的引用
  • 高等数学上册 第五章 定积分 知识点总结
  • 【无标题】uniapp引入萤石云 真机无法运行 踩坑集合
  • python函数
  • 【Linux】进程间通信——system V共享内存
  • 【数据结构】快速排序
  • 人机融合智能中的事实与价值
  • JVM | 从类加载到JVM内存结构
  • Golang之路---04 并发编程——WaitGroup
  • React(4)
  • STM32 CubeMX USB_(HID 鼠标和键盘)
  • [PM]敏捷开发之Scrum总结
  • 大数据Flink(五十七):Yarn集群环境(生产推荐)
  • web集群学习:源码安装nginx配置启动服务脚本
  • LNMP
  • Python网络爬虫在信息采集中的应用及教程
  • 云主机测试Flink磁盘满问题解决
  • iOS开发-NSOperationQueue实现上传图片队列
  • 通过 CCIP 构建跨链应用(5 个案例)
  • 基于 yolov8 的人体姿态评估
  • 计算机视觉(六)图像分类
  • 解决:vue通过params传参刷新页面参数丢失问题以及实现vue路由可选参数的解决办法
  • 将postman接口导出的json转换为markdown
  • 教您一招解决找素材困难好的方法
  • python_PyQt5开发验证K线视觉想法工具V1.2_批量验证
  • 应急响应-web后门(中间件)的排查思路
  • XML 学习笔记 7:XSD
  • neo4j图数据库基础操作命令(CQL语法)