找回密码
 注册帐号

扫一扫,访问微社区

实例教程 Unity3d截图

7
回复
4087
查看
[ 复制链接 ]
排名
1
昨日变化

1615

主题

3694

帖子

1万

积分

Rank: 16

UID
2
好友
123
蛮牛币
3729
威望
121
注册时间
2013-5-19
在线时间
2346 小时
最后登录
2019-10-14

原创先锋

2014-6-4 11:30:55 显示全部楼层 阅读模式

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

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

x
本帖最后由 admin 于 2013-6-4 11:32 编辑

几天前有人问过我怎么在unity3d在截图,当时忙着其他事情,因此没给出答案,今天我在网上查了一下,许多人把代码都贴出来了,我试着套用了一下,发现截图出来有问题,有部分能截图上(比如GUI元素和cube等),但有些就没截上(地形),我当时就郁闷了翻看了许多不同人的代码,发现核心部分就三句话:

  1. Texture2D tex = new Texture2D();
  2. tex.ReadPixels(new Rect(0,0,with,height),0,0);
  3. tex.Apply();
复制代码

那么为啥他们不出问题,而我的就出问题呢,我又去官方网站看了一下,注意到 Texture2D 的构造方法是可以有参数的,Texture2D (width : int, height : int, format : TextureFormat, mipmap : bool) ,其中format是设置图片格式的,tex.Applay()仅支持ARGB32 和RGB24两种格式,而如果你用了不带参数的构造方法生成Texture2D图片,那么默认是ARGB32,他们二个区别是什么,就是一个可以设置透明度(ARGB32),一个不可以。如果用ARGB32生成的图片调用tex.ReadPixels方法,那么系统会自动帮你计算摄像机渲染图片的透明度,这样就会导致有些地方完全透明,因此 就像物体没有照上似的。下面发下代码:

  1. //如果你图形学是菜鸟,就像我一样,那么我推荐用这种代码,简单,易懂,好上手
  2. 方法一:
  3. IEnumerator GetPicture(){
  4.   yield return new WaitForEndOfFrame();//用到这一句代码是因为要等到相机渲染完图片才能读取相机渲染的图片
  5.   int with = Screen.width;
  6.   int height = Screen.height;
  7.   Texture2D tex = new Texture2D(with,height,TextureFormat.RGB24,false);//参数mipmap设置为false,你不需要为这个图片添加mipmap
  8.   tex.ReadPixels(new Rect(0,0,with,height),0,0);
  9.   tex.Apply();
  10. }
复制代码
  1. //如果你是图形学的大神,想自己设置图片的透明度,那就用这种代码吧
  2. 方法二
  3. IEnumerator GetPicture(){
  4.   
  5.   yield return new WaitForEndOfFrame();
  6.   int with = Screen.width;
  7.   int height = Screen.height;
  8.   Texture2D tex = new Texture2D(with,height,TextureFormat.ARGB32,false);
  9.   tex.ReadPixels(new Rect(0,0,with,height),0,0);

  10. //这个for循环是设置图片的具体颜色的,图形大神们根据需要自己改变,我只是做个例子
  11.   for(int i = 0; i < with;i++)
  12.   {
  13.    for(int j = 0; j < height;j++)
  14.    {
  15.     Color c = tex.GetPixel(i,j);//获取某一点的颜色值
  16.     c.a = 1; //设置透明度,我把所有的都设为1,效果就同上面的代码一样
  17.     tex.SetPixel(i,j,c);//设置该点的颜色
  18.    }
  19.   }
  20.   tex.Apply();
  21. }
复制代码

当然有些人想要把图片保存到本地或者上传到网站,我就不发具体代码,这些网上讲的比我清楚,当然如果仅仅是保存到本地,那么我就推荐下面的方法。

  1. //方法三
  2. Application.CaptureScreenshot
复制代码

这个方法,就如方法名本身所说,就是截图方法,只需一行代码就解决截图的问题,并且保存在自己电脑上。

       感谢QQ:272076835





unity3d如何贴图;unity3d gui c#;ienumerator unity3d;unity3d做地形;unity3d渲染设置;unity3d 支持c;unity3d new gui;unity3d 图片格式;unity3d 支持的格式;c unity3d学哪个好;unity3d 5.0 贴图;unity3d怎么贴图;unity3d 贴图;unity3d c gui;unity3d ienumerator;unity3d怎么做地形;unity3d 5.3.3渲染设置;unity3d为什么不支持c;为什么unity3d不支持c++;unity3d 支持c++吗;unity3d支持c++;unity3d 4.6 new gui;unity3d格式的图片;unity3d支持 格式;学unity3d需要 c#
回复

使用道具 举报

5熟悉之中
953/1000
排名
2477
昨日变化

12

主题

128

帖子

953

积分

Rank: 5Rank: 5

UID
18
好友
4
蛮牛币
729
威望
30
注册时间
2013-5-28
在线时间
233 小时
最后登录
2019-3-8
2014-6-4 13:05:49 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

7日久生情
2259/5000
排名
550
昨日变化

18

主题

355

帖子

2259

积分

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

UID
1285
好友
5
蛮牛币
4475
威望
0
注册时间
2013-7-31
在线时间
438 小时
最后登录
2019-10-8

活力之星

2014-11-15 15:56:54 显示全部楼层
Application.CaptureScreenshot 用这个是简单,但是图片不是立刻生成啊,我发现截了图后,需要停止游戏,在到相应的文件夹中图片才生成了,这是何解呢?
回复 支持 反对

使用道具 举报

排名
64937
昨日变化

0

主题

2

帖子

4

积分

Rank: 1

UID
9297
好友
0
蛮牛币
19
威望
0
注册时间
2013-11-30
在线时间
3 小时
最后登录
2013-12-5
2014-12-1 13:30:05 显示全部楼层
请问  用最后一种方法为什么导入手机上后   手机的画面会很卡  
还有怎么选择保存图片的路径呢
谢谢啦><
回复 支持 反对

使用道具 举报

4四处流浪
354/500
排名
9202
昨日变化

11

主题

191

帖子

354

积分

Rank: 4

UID
16506
好友
2
蛮牛币
848
威望
0
注册时间
2014-3-5
在线时间
50 小时
最后登录
2019-8-9
2015-6-1 15:09:17 显示全部楼层
大神请问下怎么可以把图片保存到任意位置呢?类似QQ截图,想保存到哪里就保存在哪里
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1146/1500
排名
1529
昨日变化

0

主题

154

帖子

1146

积分

Rank: 6Rank: 6Rank: 6

UID
10583
好友
1
蛮牛币
3105
威望
0
注册时间
2013-12-18
在线时间
158 小时
最后登录
2017-9-18
2015-6-4 08:48:39 显示全部楼层
IEnumerator CutImage()
    {
        yield return new WaitForEndOfFrame();
        Texture2D cutImage = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
        cutImage.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        cutImage.Apply();
        byte[] bytes = cutImage.EncodeToPNG();
        Destroy(cutImage);
        string path = Helper.GetFullPath("text.png");//保存的位置,可以自己弄一个位置
        Helper.SaveFileData(path, bytes);
    }

public static bool SaveFileData(string fm, byte[] buffer)
    {
        try
        {
            if (buffer == null) return false;
            FileStream fs = new FileStream(fm, FileMode.Create, FileAccess.Write);
            fs.Write(buffer, 0, buffer.Length);
            fs.Close();
            return true;
        }
        catch (System.Exception ex)
        {
            Debug.Log("SaveFileDate error:" + ex.Message);
            return false;
        }
    }
回复 支持 反对

使用道具 举报

排名
861
昨日变化

6

主题

168

帖子

1805

积分

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

UID
10176
好友
9
蛮牛币
2380
威望
0
注册时间
2013-12-12
在线时间
471 小时
最后登录
2019-7-21
2015-12-10 09:43:09 显示全部楼层
zumg 发表于 2013-11-15 15:56
Application.CaptureScreenshot 用这个是简单,但是图片不是立刻生成啊,我发现截了图后,需要停止游戏,在 ...

我也遇到这样的问题,保存在手机中,要过段时间才能在相册中看到
回复 支持 反对

使用道具 举报

排名
34890
昨日变化

0

主题

13

帖子

57

积分

Rank: 2Rank: 2

UID
155826
好友
0
蛮牛币
0
威望
0
注册时间
2016-7-8
在线时间
36 小时
最后登录
2016-8-25
2016-8-22 14:27:48 显示全部楼层
截图多张呢··应该怎么改
回复 支持 反对

使用道具 举报

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

本版积分规则