Unity三种截屏方法(非自带API)
者利用了三种表现形式:
1,选择截图路径的方法
2,直接截取截屏的方法
3,截取鼠标圈选区域。
上代码,:
第一种是调用.net的类库,需要引用System.Windows.Forms.dll,在Assents文件夹里新建Plugins文件夹将System.Windows.Forms.dll放入其中。
在头部添加
using System.Windows.Forms;
public enum Method { ChooseFileDialog,GetAllScreen,MouseChoose};
public Method GetMethod ;
Vector2 pos1;
Vector2 pos2;
float time;
bool isShowRect = false;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (GetMethod == Method.ChooseFileDialog)
{
Camera.main.GetComponent<DrawRect>().enabled = false;
if (Input.GetKeyDown(KeyCode.X))
{
SaveFileDialog saveLog = new SaveFileDialog();
saveLog.InitialDirectory = UnityEngine.Application.dataPath;
saveLog.Filter = "Image Files(*.JPG;*.BMP;*.PNG)|*.JPG;*.BMP;*.PNG|All files (*.*)|*.*";
DialogResult result = saveLog.ShowDialog();
if (result == DialogResult.OK)
{
string path = saveLog.FileName;
StartCoroutine(fnGetScreen(path));
//UnityEngine.Application.CaptureScreenshot(path);
}
}
}
else if (GetMethod == Method.GetAllScreen)
{
Camera.main.GetComponent<DrawRect>().enabled = false;
if (Input.GetKeyDown(KeyCode.X))
{
StartCoroutine(fnGetScreen());
}
}
else if(GetMethod == Method.MouseChoose)
{
Camera.main.GetComponent<DrawRect>().enabled = true;
if (Input.GetMouseButtonDown(0))
{
pos1 = Input.mousePosition;
print(pos1);
}
if (Input.GetMouseButtonUp(0))
{
pos2 = Input.mousePosition;
print(pos2);
if (pos1 != pos2)
{
if (Vector3.Distance(pos1, pos2) > 2f)
{
StartCoroutine(GetCapture());
}
}
}
}
}
IEnumerator GetCapture()
{
yield return new WaitForEndOfFrame();
Texture2D tex = new Texture2D((int)Mathf.Abs(pos2.x-pos1.x), (int)Mathf.Abs(pos1.y-pos2.y), TextureFormat.RGB24, false);
Rect rect = new Rect(Mathf.Min((int)pos1.x,(int)pos2.x),Mathf.Min((int)pos1.y, (int)pos2.y), (int)Mathf.Abs(pos2.x - pos1.x), (int)Mathf.Abs(pos1.y - pos2.y));
tex.ReadPixels(rect, 0, 0, true);
tex.Apply();
byte[] imagebytes = tex.EncodeToPNG();//转化为png图
tex.Compress(false);//对屏幕缓存进行压缩
//image.mainTexture = tex;//对屏幕缓存进行显示(缩略图)
File.WriteAllBytes(UnityEngine.Application.dataPath + "/ScreenShot/screencapture.png", imagebytes);//存储png图
}
IEnumerator fnGetScreen()
{
yield return new WaitForEndOfFrame();
Texture2D tex2 = new Texture2D(UnityEngine.Screen.width, UnityEngine.Screen.height, TextureFormat.RGB24, false);
Rect rect2 = new Rect(0, 0, UnityEngine.Screen.width, UnityEngine.Screen.height);
tex2.ReadPixels(rect2, 0, 0, true);
tex2.Apply();
byte[] imagebytes2 = tex2.EncodeToPNG();
tex2.Compress(false);
File.WriteAllBytes(UnityEngine.Application.dataPath + "/ScreenShot/screen.png", imagebytes2);//存储png图
}
IEnumerator fnGetScreen(string s)
{
yield return new WaitForEndOfFrame();
Texture2D tex2 = new Texture2D(UnityEngine.Screen.width, UnityEngine.Screen.height, TextureFormat.RGB24, false);
Rect rect2 = new Rect(0, 0, UnityEngine.Screen.width, UnityEngine.Screen.height);
tex2.ReadPixels(rect2, 0, 0, true);
tex2.Apply();
byte[] imagebytes2 = tex2.EncodeToPNG();
tex2.Compress(false);
File.WriteAllBytes(s, imagebytes2);//存储png图
}
脚本贴到Maincamera上,然后新建一个DrawRect脚本,将脚本也贴到MainCamera上。
public class DrawRect : MonoBehaviour {
private Vector2 mMouseStart, mMouseEnd;
private bool mBDrawMouseRect;
private Material rectMat = null;//画线的材质 不设定系统会用当前材质画线 结果不可控
void Start()
{
mBDrawMouseRect = false;
rectMat = new Material("Shader \"Lines/Colored Blended\" {" +
"SubShader { Pass { " +
" Blend SrcAlpha OneMinusSrcAlpha " +
" ZWrite Off Cull Off Fog { Mode Off } " +
" BindChannels {" +
" Bind \"vertex\", vertex Bind \"color\", color }" +
"} } }");//生成画线的材质
rectMat.hideFlags = HideFlags.HideAndDontSave;
rectMat.shader.hideFlags = HideFlags.HideAndDontSave;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
//按下鼠标左键
{
Vector3 mousePosition = Input.mousePosition;
mMouseStart = new Vector2(mousePosition.x, mousePosition.y);
}
if (Input.GetMouseButton(0))
//持续按下鼠标左键
{
mBDrawMouseRect = true;
Vector3 mousePosition = Input.mousePosition;
mMouseEnd = new Vector2(mousePosition.x, mousePosition.y);
}
if (Input.GetMouseButtonUp(0))
{
mBDrawMouseRect = false;
}
}
void OnGUI()
{
if (mBDrawMouseRect)
Draw(mMouseStart, mMouseEnd);
}
//渲染2D框
void Draw(Vector2 start, Vector2 end)
{
rectMat.SetPass(0);
GL.PushMatrix();//保存摄像机变换矩阵
Color clr = Color.green;
clr.a = 0.1f;
GL.LoadPixelMatrix();//设置用屏幕坐标绘图
//透明框
GL.Begin(GL.QUADS);
GL.Color(clr);
GL.Vertex3(start.x, start.y, 0);
GL.Vertex3(end.x, start.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.Vertex3(start.x, end.y, 0);
GL.End();
//线
//上
GL.Begin(GL.LINES);
GL.Color(Color.green);
GL.Vertex3(start.x, start.y, 0);
GL.Vertex3(end.x, start.y, 0);
GL.End();
//下
GL.Begin(GL.LINES);
GL.Color(Color.green);
GL.Vertex3(start.x, end.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.End();
//左
GL.Begin(GL.LINES);
GL.Color(Color.green);
GL.Vertex3(start.x, start.y, 0);
GL.Vertex3(start.x, end.y, 0);
GL.End();
//右
GL.Begin(GL.LINES);
GL.Color(Color.green);
GL.Vertex3(end.x, start.y, 0);
GL.Vertex3(end.x, end.y, 0);
GL.End();
GL.PopMatrix();//还原
}
}
Unity三种截屏方法(非自带API)的更多相关文章
- Windows的三种截屏方法
「发表于知乎」戳
- IOS开发-几种截屏方法
IOS开发-几种截屏方法 1. UIGraphicsBeginImageContextWithOptions(pageView.page.bounds.size, YES, zoomSc ...
- Android开发笔记:安卓程序截屏方法
1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...
- .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)
.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public cl ...
- Android系统的三种分屏显示模式
Google在Android 7.0中引入了一个新特性——多窗口支持,允许用户一次在屏幕上打开两个应用.在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示.在电视设备 ...
- JSON三种数据解析方法(转)
原 JSON三种数据解析方法 2018年01月15日 13:05:01 zhoujiang2012 阅读数:7896 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- iOS截屏方法
//获取屏幕截屏方法 - (UIImage *)capture { // 创建一个context UIGraphicsBeginImageContextWithOptions(self.view.bo ...
- 同源策略(same-origin policy)及三种跨域方法
同源策略(same-origin policy)及三种跨域方法 1.同源策略 含义: 同源是指文档的来源相同,主要包括三个方面 协议 主机 载入文档的URL端口 所以同源策略就是指脚本只能读取和所属文 ...
- Linux下截屏方法
参考百度经验 https://jingyan.baidu.com/article/48a42057c8e8dfa92525047c.html 第一种: 截屏部分画面并保存 快捷键Shift+PrtSc
随机推荐
- javascript基础学习(一)
javascript输出: javascript通过不同的方式来显示数据: (1)windows.alert()弹出警告框: (2)document.write()将方法写入HTML文档中: (3)i ...
- javascript——迭代方法
<script type="text/javascript"> //五个迭代方法 都接受两个参数:要在每一项上运行的函数 和 运行该函数的作用域(可选) //every ...
- css编译工具Sass中混合宏,继承,占位符分别在什么时候使用
//SCSS中混合宏使用 @mixin mt($var){ margin-top: $var; } .block { @include mt(5px); span { display:block; @ ...
- PHP数据学习-二维数组【3】
<?php // $project = array( // array("bai",12,23.0), // array("zeng",34,12.0), ...
- Python,遍历目录下TXT
import os #获取根目录,递归得到所以txt文件的路径 list_dirs = os.walk(os.curdir) txtfilenames=[] for root, dirs, files ...
- Linux学习2
第三讲Linux常用命令04 压缩:gzip: 1.只能压缩文件,不能压缩目录 2.不保留源文件 解压缩:gunzip gzip -d ------------------------------ ...
- [cocoapods速成] cocoapods的基本用法和自制 podspec
1 安装方法 主要命令: sudo gem install cocoapods ------------------------------------------------------------ ...
- Adobe Photoshop CS或者CC卸载不了怎么办?
有木有没有遇到这个问题的同学?使用Adobe Creative Suite CleanerToo工具下载就好了~ 下载地址:http://pan.baidu.com/s/1pJ3aBsn
- C语言连接MySql数据库
C语言连接MySql数据库(CodeBlocks) 操作系统:Windows7(32位)编译软件:Code::Blocks 10.05数 据 库:mysql-5.1.62-win32 数据库内的数据: ...
- Apache Maven 入门篇(下)
第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点接触后,接下去的一步是要了解maven的核心概念,这样才能在使用maven的时 ...