热门IT资讯网

Unity3D截图功能总结,并保存在指定的文件夹

发表于:2024-11-25 作者:热门IT资讯网编辑
编辑最后更新 2024年11月25日,快过新年了,一直在加班赶项目,没时间写博客,今天上班最后一天,就休息过年了,将我强几天在做一个截图功能分享出来,网上查了很多,但是都是在Unity Editor下好使,能截图,并显示出来,但是,在An

快过新年了,一直在加班赶项目,没时间写博客,今天上班最后一天,就休息过年了,将我强几天在做一个截图功能分享出来,网上查了很多,但是都是在Unity Editor下好使,能截图,并显示出来,但是,在Android下,截图成功,并能显示出来,但是就是存不到手机相册中,找了很多原因不知道怎么回事,查阅各种资料最终解决了。我总结了一下,我用过的方法,希望大家 能够用的上。


第一种方法:

使用Application类下的CaptureScreenshot方法。但是我觉得这并不好用,不随意。不能针对某一个相机(camera)的画面,进行截图。对局部画面截图,实现起来不方便,效率也低。

   using System.Windows.Forms;      //截图保存在电脑C盘中,安卓的我没想出用这中方法截图怎么保存到手机   if (Input .GetMouseButtonDown (0)) {     SaveFileDialog save = new SaveFileDialog();      save.InitialDirectory = "c:\\";      save.Filter = "Image Files(*.JPG;*.BMP;*.PNG)|*.JPG;*.BMP;*.PNG|All files (*.*)|*.*";           DialogResult result = save.ShowDialog();           if (result == DialogResult.OK) {             string path = save.FileName;      //EditorUtility.SaveFilePanel也可以实现保存,但是只能在Unity Editor下运行。             Application.CaptureScreenshot(path);           }       }

Android下, Application.CaptureScreenshot(); 截图保存在沙河中,大家可以看一看 ,讲的很清楚: http://jingpin.jikexueyuan.com/article/30470.html


第二种方法:采用的是new Texture2D来截取图片分为截取一部分和全屏;

//截取一块区域,通过鼠标点击的点来获取要截取的区域;using UnityEngine;  using System.Collections;  using System.IO;  public class ShotScreenPicture : MonoBehaviour  {        Texture2D p_w_picpath;      Texture2D cutImage;      WWW www;      Rect rect;      float time;      Vector2 pos1;      Vector2 pos2;        // Update is called once per frame      void Update()      {          //点击鼠标左键,记录第一个位置          if (Input.GetMouseButtonDown(0))          {              pos1 = Input.mousePosition;              time = Time.time;              if (time > 1f)              {                  Debug.Log(pos1);              }          }          //放开左键记录第二个位置          if (Input.GetMouseButtonUp(0))          {              pos2 = Input.mousePosition;              Debug.Log(pos2);              StartCoroutine(CutImage());              time = 0;          }      }        void OnGUI()      {          //当下载完成          if (www.isDone)          {              GUI.DrawTexture(new Rect(0, 0, 600, 904), p_w_picpath);          }            GUI.Button(new Rect(0, 0, 100, 50), "W" + Screen.width + "H" + Screen.height);            if (pos1 != null)          {              GUI.Button(new Rect(0, 50, 150, 50), pos1.ToString());          }          if (pos2 != null)          {              GUI.Button(new Rect(0, 100, 150, 50), pos2.ToString());          }          if (cutImage != null)          {              GUI.Button(new Rect(0, 150, 150, 50), "p_w_picpath W" + cutImage.width + "H" + cutImage.height);          }            if (rect != null)          {              GUI.Button(new Rect(0, 200, 250, 50), rect.ToString());          }      }      //截图      IEnumerator CutImage()      {          //图片大小          cutImage = new Texture2D((int)(pos2.x - pos1.x), (int)(pos1.y - pos2.y), TextureFormat.RGB24, true);              //坐标左下角为0          rect = new Rect((int)pos1.x, Screen.height - (int)(Screen.height - pos2.y), (int)(pos2.x - pos1.x), (int)(pos1.y - pos2.y));            yield return new WaitForEndOfFrame();          cutImage.ReadPixels(rect, 0, 0, true);                     cutImage.Apply();          yield return cutImage;          byte[] byt = cutImage.EncodeToPNG();          //保存截图          //如果是Andriod平台,可以把Application.streamingAssetsPath换成destination = "/sdcard/DCIM/Camera";        File.WriteAllBytes(Application.streamingAssetsPath + "/CutImage.png", byt);      }  }
 //全屏截图 //存储路径    private string Path_save;    //读取路径    private string Path_read;    private string filepath;    private string destination;    void Start()    {        filepath = Application.persistentDataPath + "/test.txt";    }    public void OnClickShot()    {        StartCoroutine(getTexture2d());    }    IEnumerator getTexture2d()    {        //隐藏UI       .................................        //截图操作        yield return new WaitForSeconds(0.1f);        Texture2D t = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);        //显示UI        .......................             t.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, true);        byte[] bytes = t.EncodeToPNG();        t.Compress(true);        t.Apply();        img.texture = t;        //t就是截到的图片我们可以在这里上传到服务器        //下面是开始保存        //获取系统时间        System.DateTime now = new System.DateTime();        now = System.DateTime.Now;        string filename = string.Format("p_w_picpath{0}{1}{2}{3}.png", now.Day, now.Hour, now.Minute, now.Second);        //记录每一个截图名字        StreamWriter sw;        FileInfo ft = new FileInfo(filepath);        la[1].text = filename;        if (!ft.Exists)        {            sw = ft.CreateText();        }        else        {            sw = ft.AppendText();        }        sw.WriteLine(filename);        sw.Close();        sw.Dispose();        //应用平台判断,路径选择        if (Application.platform == RuntimePlatform.Android)        {            string origin = Path_save;            //保存在Android相册中,如果是PC就改成Application .dataPath 的路径            destination = "/sdcard/DCIM/Camera";            if (!Directory.Exists(destination))            {                Directory.CreateDirectory(destination);            }            destination = destination + "/" + filename;            Path_save = destination;        }        //保存文件        File.WriteAllBytes(Path_save, bytes);    }


第三种方法:有一个截图插件,在附件即可下载;

snapShot.CaptureAndSaveToAlbum();

即可截图成功,包含了选区域和全屏截图。


【注意】第二种和第三种保存在Android下的手机相册中,都要在发布的时候改成安卓默认路径


最后再给一个调安卓截图的功能(在搜索的时候看到的,觉得挺好的,分享给大家)



http://www.360doc.com/content/16/0128/23/21062130_531360104.shtml

http://www.ceeger.com/forum/read.php?tid=15252&page=1

0