zoukankan      html  css  js  c++  java
  • Unity3d之截图方法

    http://blog.csdn.net/highning0007/article/details/37991787

    分类: Unity3D2013-11-28 17:13 1014人阅读 评论(2) 收藏 举报

    下面是我总结的、在u3d中的,三种截屏方法:

    1、使用Application类下的CaptureScreenshot方法。

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
    1. void CaptureScreen()   
    2. {  
    3.     Application.CaptureScreenshot("Screenshot.png", 0);  
    4. }  

    这个方法,截取的是某一帧时整个游戏的画面,或者说是全屏截图吧。

    a、不能针对某一个相机(camera)的画面,进行截图。

    b、对局部画面截图,实现起来不方便,效率也低,不建议在项目中使用:

    虽然CaptureScreenshot这个方法呢,本身是不要做到这一点的。但是我们可以走曲线救国的路线来实现它。思路是这样的:你可以先用这个方法截图一个全屏,然后通过路径获取到这个截图;接下来就通过相关的图形类来,取得这个截图的局部区域并保存下来,这样就能得到一个局部截图了。在这里我就不实现它了,不过有兴趣的可以试试,肯定是可以实现的。

    2、这第二个截图的方法是,使用Texture2d类下的相关方法,也可实现截图功能。

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
    1. /// <summary>  
    2. /// Captures the screenshot2.  
    3. /// </summary>  
    4. /// <returns>The screenshot2.</returns>  
    5. /// <param name="rect">Rect.截图的区域,左下角为o点</param>  
    6. Texture2D CaptureScreenshot2(Rect rect)   
    7. {  
    8.     // 先创建一个的空纹理,大小可根据实现需要来设置  
    9.     Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24,false);  
    10.   
    11.     // 读取屏幕像素信息并存储为纹理数据,  
    12.     screenShot.ReadPixels(rect, 0, 0);  
    13.     screenShot.Apply();  
    14.   
    15.     // 然后将这些纹理数据,成一个png图片文件  
    16.     byte[] bytes = screenShot.EncodeToPNG();  
    17.     string filename = Application.dataPath + "/Screenshot.png";  
    18.     System.IO.File.WriteAllBytes(filename, bytes);  
    19.     Debug.Log(string.Format("截屏了一张图片: {0}", filename));  
    20.   
    21.     // 最后,我返回这个Texture2d对象,这样我们直接,所这个截图图示在游戏中,当然这个根据自己的需求的。  
    22.     return screenShot;  
    23. }  
    截全屏(如下图, 注:有ui):
    CaptureScreenshot2( new Rect( Screen.width*0f, Screen.height*0f, Screen.width*1f, Screen.height*1f));


    截中间4分之(如下图):
    CaptureScreenshot2( new Rect( Screen.width*0.25f, Screen.height*0.25f, Screen.width*0.5f, Screen.height*0.5f));

    这里使用了几个Texture2d类的方法,使用上也有一些要注意的地方,自己看吧。

    当然,这个方法也不要到实现针对某个相机的截图的功能。不过关键接口已经出现了,它就是Texture2d.ReadPixels(),这段就不说了,接着往下看吧!

    3、这第三个方法,最牛了,可以针对某个相机进行截图。

    这样的话,我就可截下,我的Avatar在游戏中场景中所看的画面了,UI界面(用一个专门的camera显示)什么的是不应该有的。要做到这一点,我们应该将分出一个camera来专门显示ui界面,用另一个camera相机来场景显示场景画面。然后,我们只对场景相机进行截屏就是了。所以这关键点就是:如何实现对某个相机进行截屏了。这里用到一个新的类是RenderTexture。

    代码如下:

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
    1. /// <summary>  
    2. /// 对相机截图。   
    3. /// </summary>  
    4. /// <returns>The screenshot2.</returns>  
    5. /// <param name="camera">Camera.要被截屏的相机</param>  
    6. /// <param name="rect">Rect.截屏的区域</param>  
    7. Texture2D CaptureCamera(Camera camera, Rect rect)   
    8. {  
    9.     // 创建一个RenderTexture对象  
    10.     RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);  
    11.     // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机  
    12.     camera.targetTexture = rt;  
    13.     camera.Render();  
    14.         //ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。  
    15.         //ps: camera2.targetTexture = rt;  
    16.         //ps: camera2.Render();  
    17.         //ps: -------------------------------------------------------------------  
    18.   
    19.     // 激活这个rt, 并从中中读取像素。  
    20.     RenderTexture.active = rt;  
    21.     Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24,false);  
    22.     screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素  
    23.     screenShot.Apply();  
    24.   
    25.     // 重置相关参数,以使用camera继续在屏幕上显示  
    26.     camera.targetTexture = null;  
    27.         //ps: camera2.targetTexture = null;  
    28.     RenderTexture.active = null; // JC: added to avoid errors  
    29.     GameObject.Destroy(rt);  
    30.     // 最后将这些纹理数据,成一个png图片文件  
    31.     byte[] bytes = screenShot.EncodeToPNG();  
    32.     string filename = Application.dataPath + "/Screenshot.png";  
    33.     System.IO.File.WriteAllBytes(filename, bytes);  
    34.     Debug.Log(string.Format("截屏了一张照片: {0}", filename));  
    35.       
    36.     return screenShot;  
    37. }  

    多的我就不说了,相关知识自己去找资料吧,因为我也不懂!

    直接上图了。

    无ui的全屏图:

    只有ui的全屏图:

    有ui有场景的全屏图(只指定这两个相机哦,相关提示在代码的“//ps”中):


    转载请在文首注明出处:http://blog.csdn.net/anyuanlzh/article/details/17008909

  • 相关阅读:
    Using Resource File on DotNet
    C++/CLI VS CSharp
    JIT VS NGen
    [Tip: disable vc intellisense]VS2008 VC Intelisense issue
    UVa 10891 Game of Sum(经典博弈区间DP)
    UVa 10723 Cyborg Genes(LCS变种)
    UVa 607 Scheduling Lectures(简单DP)
    UVa 10401 Injured Queen Problem(简单DP)
    UVa 10313 Pay the Price(类似数字分解DP)
    UVa 10635 Prince and Princess(LCS N*logN)
  • 原文地址:https://www.cnblogs.com/wanqieddy/p/4513702.html
Copyright © 2011-2022 走看看