开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:762

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

查看: 238|回复: 3

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

[复制链接]  [移动端链接]
排名
17118
昨日变化
4

5

主题

11

帖子

80

积分

Rank: 2Rank: 2

UID
265522
好友
0
蛮牛币
147
威望
0
注册时间
2018-1-20
在线时间
32 小时
最后登录
2018-5-24
发表于 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无法在静态中调用,我们是自己封装成了静态,为了读者方便就改成非静态方法,这里大家可以自行封装。




回复

使用道具 举报

6蛮牛粉丝
1440/1500
排名
6183
昨日变化
45

0

主题

1069

帖子

1440

积分

Rank: 6Rank: 6Rank: 6

UID
267381
好友
3
蛮牛币
2350
威望
0
注册时间
2018-2-1
在线时间
179 小时
最后登录
2018-5-27

迈向小康

发表于 2018-5-12 09:48:40 | 显示全部楼层
谢谢分享
[发帖际遇]: 墨染青天 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

3偶尔光临
219/300
排名
8678
昨日变化
5

1

主题

32

帖子

219

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

3偶尔光临
157/300
排名
17118
昨日变化
491

1

主题

91

帖子

157

积分

Rank: 3Rank: 3Rank: 3

UID
280625
好友
0
蛮牛币
115
威望
0
注册时间
2018-5-10
在线时间
33 小时
最后登录
2018-5-26
发表于 4 天前 | 显示全部楼层
感谢分享

回复

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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