Unity三种截屏方法(非自带API)

时间:2021-09-25 05:11:54

者利用了三种表现形式:

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();//还原
}
}