zoukankan      html  css  js  c++  java
  • 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();//还原
        }
    }



    
    
  • 相关阅读:
    微软的PDC2009开完了,上去淘Video喽,有不少好东西
    [摘要]Pushing the Limits of Windows: Paged and Nonpaged Pool From Mark Russinovich's blog
    [摘要]Pushing the Limits of Windows: Virtual Memory From Mark Russinovich's blog
    如何知道在Windbg中得到Memory type(也叫做caching type)
    用ImgBurn做了一张可以安装所有版本的Win7安装盘
    WF 工作流(5)
    ORACLE 綁定變量
    oracle inside(1)
    WF 工作流(1)
    WF 工作流(2)
  • 原文地址:https://www.cnblogs.com/YDoubleC/p/6203733.html
Copyright © 2011-2022 走看看