游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:779

当前位置:游戏蛮牛 技术专区 教程分享

查看: 441|回复: 3

[实例教程] 3D截屏保存到相册(转)

[复制链接]  [移动端链接]
排名
16703
昨日变化
9

6

主题

15

帖子

93

积分

Rank: 2Rank: 2

UID
265522
好友
0
蛮牛币
188
威望
0
注册时间
2018-1-20
在线时间
36 小时
最后登录
2018-8-7
发表于 2018-5-10 10:18:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
截屏保存到相册,并且刷新相册   转自(http://www.cnblogs.com/lihangppz/p/8530351.html)
  要做一个截图的功能,并且玩家可以在相册中看到。
  做的时候遇到了三个问题
  1、unity自带的截图API,Application.CaptureScreenshot在上不生效
  2、图片保存的路径获取
  3、保存的图片可以在手机的文件管理中找到,但是相册中没有。
  解决方案:
  1、这个问题查了半天没有说原因,大多数人都给出了新方案用 File.WriteAllBytes去实现,代码如下:
[url=][/url]
IEnumerator CutImage(string name)    {        //图片大小          Texture2D tex = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, true);        yield return new WaitForEndOfFrame();        tex.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, true);        tex.Apply();        yield return tex;        byte[] byt = tex.EncodeToPNG();        string path = Application.persistentDataPath.Substring(0, Application.persistentDataPath.IndexOf("Android"));        File.WriteAllBytes(path + "/Pictures/Screenshots/" + name, byt);    }[url=][/url]

  2、关于路径Application中有四种路径(可自行百度),我们需要的是保存到截图专用的路径Pictures中,代码参考上面最后两行,也可将最后一样的Pictures/Screenshots(截图路径)可以替换/DCIM/Camera/(相册路径)。这样可以避免删掉游戏后图片消失。
  3、关于刷新相册,网上大多数人给的方案为调用java中的MediaScannerConnection.scanFile(百度上很多,这里不细说)。但是因为我们需要热更这个功能,所以必须在unity上去实现。
后来一个大佬提了一个建议,用反射。代码如下
[url=][/url]
    //刷新图片,显示到相册中    void ScanFile(string[] path)    {        using (AndroidJavaClass PlayerActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))        {            AndroidJavaObject playerActivity = PlayerActivity.GetStatic<AndroidJavaObject>("currentActivity");            using (AndroidJavaObject Conn = new AndroidJavaObject("android.media.MediaScannerConnection", playerActivity, null))            {                Conn.CallStatic("scanFile", playerActivity, path, null, null);            }        }    }[url=][/url]

  在unity中实现刷新相册,算是自己独立解决的一个问题,小小的有成就感。

完整代码如下
[url=][/url]
using UnityEngine;using System.Collections;using System;using System.IO;public class CaptureScreenshotMgr: MonoBehaviour{    /// <summary>    /// 保存截屏图片,并且刷新相册(Android和iOS)    /// </summary>    /// <param name="name">若空就按照时间命名</param>    public void CaptureScreenshot(string name = "")    {        string _name = "";        if (string.IsNullOrEmpty(name))        {            _name = "Screenshot_" + GetCurTime() + ".png";        }        //编辑器下        //string path = Application.persistentDataPath + "/" + _name;        //Application.CaptureScreenshot(path, 0);        //EDebug.Log("图片保存地址" + path);        //Android版本        StartCoroutine(CutImage(_name));        EDebug.Log("图片保存地址" + _name);    }    //截屏并保存    IEnumerator CutImage(string name)    {        //图片大小          Texture2D tex = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, true);        yield return new WaitForEndOfFrame();        tex.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, true);        tex.Apply();        yield return tex;        byte[] byt = tex.EncodeToPNG();        string path = Application.persistentDataPath.Substring(0, Application.persistentDataPath.IndexOf("Android"));        File.WriteAllBytes(path + "/Pictures/Screenshots/" + name, byt);        string[] paths = new string[1];        paths[0] = path;        ScanFile(paths);    }    //刷新图片,显示到相册中    void ScanFile(string[] path)    {        using (AndroidJavaClass PlayerActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))        {            AndroidJavaObject playerActivity = PlayerActivity.GetStatic<AndroidJavaObject>("currentActivity");            using (AndroidJavaObject Conn = new AndroidJavaObject("android.media.MediaScannerConnection", playerActivity, null))            {                Conn.CallStatic("scanFile", playerActivity, path, null, null);            }        }    }    /// <summary>    /// 获取当前年月日时分秒,如201803081916    /// </summary>    /// <returns></returns>    string GetCurTime()    {        return DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString()            + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();    }}[url=][/url]

备注:本来这些方法是静态的,StartCoroutine无法在静态中调用,我们是自己封装成了静态,为了读者方便就改成非静态方法,这里大家可以自行封装。




回复

使用道具 举报

7日久生情
1906/5000
排名
4258
昨日变化
6

0

主题

1334

帖子

1906

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
267381
好友
5
蛮牛币
3186
威望
0
注册时间
2018-2-1
在线时间
256 小时
最后登录
2018-8-6
发表于 2018-5-12 09:48:40 | 显示全部楼层
谢谢分享
[发帖际遇]: 墨染青天 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
300/500
排名
7284
昨日变化
2

1

主题

42

帖子

300

积分

Rank: 4

UID
217654
好友
0
蛮牛币
694
威望
0
注册时间
2017-4-14
在线时间
97 小时
最后登录
2018-8-14
发表于 2018-5-15 15:59:40 | 显示全部楼层
楼主帖子布局有点乱了 ,能不能做成一个小demo  万分感谢

回复 支持 反对

使用道具 举报

4四处流浪
323/500
排名
7626
昨日变化
5

2

主题

101

帖子

323

积分

Rank: 4

UID
280625
好友
0
蛮牛币
496
威望
0
注册时间
2018-5-10
在线时间
72 小时
最后登录
2018-8-16
发表于 2018-5-23 10:43:00 | 显示全部楼层
感谢分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表