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





posted @ 2014-07-14 08:59  三年二班小黄花  阅读(319)  评论(0编辑  收藏  举报