热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

Unity实现相机截图功能

这篇文章主要为大家详细介绍了Unity实现相机截图功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

最近做项目的时候需要在游戏里截一张高清截图,研究了一下写成脚本,方便以后使用。

脚本可以自定义分辨率,用相机截高清截图。可以用代码动态截图,也可以在编辑模式下截图。

注意截图宽高比要正确,宽高比不正确时可能会出问题。

截图效果:

脚本:

CameraCapture.cs

using UnityEngine;
using System.IO;
 
/// 
/// 相机截图
/// ZhangYu 2018-07-06
/// 
public class CameraCapture : MonoBehaviour {
 
 // 截图尺寸
 public enum CaptureSize {
 CameraSize,
 ScreenResolution,
 FixedSize
 }
 
 // 目标摄像机
 public Camera targetCamera;
 // 截图尺寸
 public CaptureSize captureSize = CaptureSize.CameraSize;
 // 像素尺寸
 public Vector2 pixelSize;
 // 保存路径
 public string savePath = "StreamingAssets/";
 // 文件名称
 public string fileName = "cameraCapture.png";
 
 #if UNITY_EDITOR
 private void Reset() {
 targetCamera = GetComponent();
 pixelSize = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);
 }
 #endif
 
 ///  保存截图 
 /// 目标摄像机
 public void saveCapture() {
 Vector2 size = pixelSize;
 if (captureSize == CaptureSize.CameraSize) {
  size = new Vector2(targetCamera.pixelWidth, targetCamera.pixelHeight);
 } else if (captureSize == CaptureSize.ScreenResolution) {
  size = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);
 }
 string path = Application.dataPath + "/" + savePath + fileName;
 saveTexture(path, capture(targetCamera, (int)size.x, (int)size.y));
 }
 
 ///  相机截图 
 /// 目标相机
 public static Texture2D capture(Camera camera) {
 return capture(camera, Screen.width, Screen.height);
 }
 
 ///  相机截图 
 /// 目标相机
 /// 宽度
 /// 高度
 public static Texture2D capture(Camera camera, int width, int height) {
 RenderTexture rt = new RenderTexture(width, height, 0);
 rt.depth = 24;
 rt.antiAliasing = 8;
 camera.targetTexture = rt;
 camera.RenderDontRestore();
 RenderTexture.active = rt;
 Texture2D texture = new Texture2D(width, height, TextureFormat.ARGB32, false, true);
 Rect rect = new Rect(0, 0, width, height);
 texture.ReadPixels(rect, 0, 0);
 texture.filterMode = FilterMode.Point;
 texture.Apply();
 camera.targetTexture = null;
 RenderTexture.active = null;
 Destroy(rt);
 return texture;
 }
 
 ///  保存贴图 
 /// 保存路径
 /// Texture2D
 public static void saveTexture(string path, Texture2D texture) {
 File.WriteAllBytes(path, texture.EncodeToPNG());
 #if UNITY_EDITOR
 Debug.Log("已保存截图到:" + path);
 #endif
 }
 
}

脚本编辑器:

CameraCaptureEditor.cs

using UnityEditor;
using UnityEngine;
 
/// 
/// 相机截图 编辑器
/// ZhangYu 2018-07-06
/// 
[CanEditMultipleObjects]
[CustomEditor(typeof(CameraCapture))]
public class CameraCaptureEditor : Editor {
 
 public override void OnInspectorGUI() {
 // 属性
 CameraCapture script = (CameraCapture)target;
 int selected = (int)script.captureSize;
 
 // 重绘GUI
 EditorGUI.BeginChangeCheck();
 drawProperty("targetCamera", "目标像机");
 string[] optiOns= new string[] { "像机尺寸", "屏幕尺寸", "固定尺寸"};
 selected = EditorGUILayout.Popup("截图尺寸", selected, options, GUILayout.ExpandWidth(true));
 script.captureSize = (CameraCapture.CaptureSize)selected;
 if (script.captureSize == CameraCapture.CaptureSize.FixedSize) {
  drawProperty("pixelSize", "像素尺寸");
  EditorGUILayout.HelpBox("请保持正确的宽高比!\n否则截图区域可能出现错误。", MessageType.Info);
 }
 drawProperty("savePath", "保存路径");
 drawProperty("fileName", "文件名称");
 
 // 保存截图按钮
 bool isPress = GUILayout.Button("保存截图", GUILayout.ExpandWidth(true));
 if (isPress) script.saveCapture();
 if (EditorGUI.EndChangeCheck()) serializedObject.ApplyModifiedProperties();
 }
 
 private void drawProperty(string property, string label) {
 EditorGUILayout.PropertyField(serializedObject.FindProperty(property), new GUIContent(label), true);
 }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • SPSS操作指南:双变量相关性分析的详细步骤
    本教程将详细介绍如何使用IBM SPSS Statistics进行双变量相关性分析。通过实例演示,帮助读者理解变量间的关系及其统计意义。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 如何在CAD查看器中同时打开并对比两张DWG图纸
    本文将详细介绍如何使用专业的CAD查看软件,如迅捷CAD看图,来同时打开和对比两张DWG格式的CAD图纸。无论是在设计审核还是项目管理中,掌握这一技能都能显著提高工作效率。 ... [详细]
  • 编写了几个500行左右代码的程序,但基本上解决问题还是面向过程的思维,如何从问题中抽象出类,形成类的划分和设计,从而用面向对象的思维解决问题?有这方面的入门好书吗?最好是结合几个具体的案例分析的 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • Ulysses Mac v29:革新文本编辑与写作体验
    探索Ulysses Mac v29,这款先进的纯文本编辑器为Mac用户带来了全新的写作和编辑环境。它不仅具备简洁直观的界面,还融合了Markdown等标记语言的最佳特性,支持多种格式导出,并提供强大的组织和同步功能。 ... [详细]
  • 本文详细介绍了Vim编辑器的三种主要模式及其常用命令,帮助用户更好地掌握这一强大的文本编辑工具。 ... [详细]
  • 解决Windows 10开机频繁自检问题的实用方法
    许多用户在使用Windows 10系统时,经常会遇到开机时自动进行磁盘检查的情况。这不仅影响了开机速度,还可能带来不必要的麻烦。本文将详细介绍如何通过简单的注册表修改来避免每次开机时的磁盘自检,提升系统启动效率。 ... [详细]
  • 本文详细介绍了流编辑器sed中的G、H、g、h命令,探讨了它们的工作原理及应用场景。通过实例解析和图解分析,帮助读者掌握这些高级命令的使用方法。 ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
  • 本文介绍了解决Oracle 10G数据库中ORA-12541 TNS: no listener错误的详细步骤。该错误通常发生在监听器服务未正确启动或配置不当的情况下,文章将指导您通过检查服务状态、配置注册表和启动监听器来解决问题。 ... [详细]
  • 在安装 SQL Server 时,选择混合验证模式可以提供更高的灵活性和管理便利性。如果您已经安装了 SQL Server 并使用单一的 Windows 身份验证模式,可以通过以下步骤将其更改为混合验证模式。 ... [详细]
  • 本文介绍了在 SQL Server 2012 客户端中格式化 SQL 查询语句的多种方法,包括内置功能和第三方工具,帮助用户提高代码可读性和维护性。 ... [详细]
author-avatar
小伊果果_679
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有