者利用了三种表现形式:
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();//还原 } }