(转)Unity3d的3种截图方法

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

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

void CaptureScreen()
{
    Application.CaptureScreenshot("Screenshot.png", 0);
}

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

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

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

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

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

/// <summary>
/// Captures the screenshot2.
/// </summary>
/// <returns>The screenshot2.</returns>
/// <param name="rect">Rect.截图的区域,左下角为o点</param>
Texture2D CaptureScreenshot2(Rect rect)
{
    // 先创建一个的空纹理,大小可根据实现需要来设置
    Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24,false);

    // 读取屏幕像素信息并存储为纹理数据,
    screenShot.ReadPixels(rect, 0, 0);
    screenShot.Apply();

    // 然后将这些纹理数据,成一个png图片文件
    byte[] bytes = screenShot.EncodeToPNG();
    string filename = Application.dataPath + "/Screenshot.png";
    System.IO.File.WriteAllBytes(filename, bytes);
    Debug.Log(string.Format("截屏了一张图片: {0}", filename));

    // 最后,我返回这个Texture2d对象,这样我们直接,所这个截图图示在游戏中,当然这个根据自己的需求的。
    return screenShot;
}

截全屏(如下图, 注:有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));

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

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

代码如下:

/// <summary>
/// 对相机截图。
/// </summary>
/// <returns>The screenshot2.</returns>
/// <param name="camera">Camera.要被截屏的相机</param>
/// <param name="rect">Rect.截屏的区域</param>
Texture2D CaptureCamera(Camera camera, Rect rect)
{
    // 创建一个RenderTexture对象
    RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
    // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机
    camera.targetTexture = rt;
    camera.Render();
        //ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。
        //ps: camera2.targetTexture = rt;
        //ps: camera2.Render();
        //ps: -------------------------------------------------------------------

    // 激活这个rt, 并从中中读取像素。
    RenderTexture.active = rt;
    Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24,false);
    screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素
    screenShot.Apply();

    // 重置相关参数,以使用camera继续在屏幕上显示
    camera.targetTexture = null;
        //ps: camera2.targetTexture = null;
    RenderTexture.active = null; // JC: added to avoid errors
    GameObject.Destroy(rt);
    // 最后将这些纹理数据,成一个png图片文件
    byte[] bytes = screenShot.EncodeToPNG();
    string filename = Application.dataPath + "/Screenshot.png";
    System.IO.File.WriteAllBytes(filename, bytes);
    Debug.Log(string.Format("截屏了一张照片: {0}", filename));

    return screenShot;
}

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

时间: 2024-08-07 08:39:27

(转)Unity3d的3种截图方法的相关文章

Unity3d之截图方法

http://blog.csdn.net/highning0007/article/details/37991787 Unity3d之截图方法 分类: Unity3D2013-11-28 17:13 1014人阅读 评论(2) 收藏 举报 AnYuanLzhunityunity3d截屏 下面是我总结的.在u3d中的,三种截屏方法: 1.使用Application类下的CaptureScreenshot方法. [csharp] view plaincopy void CaptureScreen()

【REACT NATIVE 跨平台应用开发】环境搭建问题记录&&XCODE7模拟器上COMMAND+R失效的几种替换方法

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2147.html React Native 这里不多介绍,其实就是个跨平台开发原生应用的开源引擎. 更详细的介绍,大家可以搜索"facebook react native" 或 "taobao react native" 附上 React Native 官方网站:http://react

[Unity3d][NGUI]两种思路解决AssetBundle的依赖关系.

接上文. 使用上文中的AssetBundle打包方式生成的文件包括了依赖关系中的文件. 一般的使用中并不会发现什么问题. 可是当配合NGUI的时候,使用dynamicFont时打包AssetBundle会将每一个组件使用的dynamicFont都分开打包进去. 导出函数请參考:导出资源 导出资源包时出现的问题: 如图: 在解决依赖关系上我使用过2种方案: 第一种是使用BuildPipeline中的PushAssetDependencies和PopAssetDependencies方法来解决依赖关

raknet for unity3d手机版的编译方法

在很久以前本人就发现了RAKNET,对比了几款开源网络库,发现RAKNET是一个不错的选择.RAKNET更适用于做游戏开发,但在我的手机点对点视频聊天项目里还是用了RAKNET.使用RAKNET做为中介服务器,手机P2P成功后还是使用RAKNET通讯.效果不错,视频语音不会丢包,很清晰流畅.当然在网络条件不好的情况下,可以设置RAKNET允许丢包,仍然能有不错的效果. raknet的缺点是不支持组播,在视频更专业的librtp支持组播,但librtp的缺点也很明显,它不支持UDT,而且如果用RA

python——几种截图对比方式!

本次记录的几种截图对比方式,主要是为了在进行手机自动化测试时,通过截图对比来判断测试的正确性,方式如下: # -*- coding: utf-8 -*- ''' 用途:利用python实现多种方法来实现图像识别 author:SYW ''' import cv2 import numpy as np from matplotlib import pyplot as plt # 最简单的以灰度直方图作为相似比较的实现 def classify_gray_hist(image1,image2,siz

Qt 3D的研究(九):尝试另外一种边缘检测方法

Qt 3D的研究(九):尝试另外一种边缘检测方法 三维应用程序,通过FBO,将3D图像渲染成纹理,然后对渲染成的纹理进行图像处理,最终显示在屏幕上的,是风格化后的图案.上一次我使用了一种普通的图像处理方法:索贝尔边缘检测法,与我们的卡通渲染结合起来,实现了这样的效果,接着,我将采用另外一种边缘检测方法--普雷维特(Prewitt)边缘检测方法来重新渲染图案. 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/44405219.欢

谈谈vector容器的三种遍历方法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector容器是最简单的顺序容器,其使用方法类似于数组,实际上vector的底层实现就是采用动态数组.在编写程序的过程中,常常会变量容器中的元素,那么如何遍历这些元素呢?本文给出三种遍历方法. 方法一:采用下标遍历 由于vector容器就是对一个动态数组的包装,所以在vector容器的内部,重载了[]运算符,函数原型为:reference operator [] (size_type n);所以我们可以采用类似于数组的方式来访问vector容

android开发中监听器的三种实现方法(OnClickListener)

Android开发中监听器的实现有三种方法,对于初学者来说,能够很好地理解这三种方法,将能更好地增进自己对android中监听器的理解. 一.什么是监听器. 监听器是一个存在于View类下的接口,一般以On******Llistener命名,实现该接口需要复写相应的on****(View v)方法(如onClick(View v)). 二.监听器的三种实现方法 (以OnClickListener为例) 方法一:在Activity中定义一个内部类继承监听器接口(这里是OnClickListener

【漏洞预警】CVE-2017-8464 震网三代漏洞复现(两种利用方法)

早在6月13日,微软发布补丁修复编号为CVE-2017-8464的漏洞,本地用户或远程攻击者可以利用该漏洞生成特制的快捷方式,并通过可移动设备或者远程共享的方式导致远程代码执行,追溯到以前,NSA就承认利用过相似漏洞且以“Olympic Game”为代号研发震网病毒,来阻止伊朗发展核武. 受影响版本 Windows 7 Windows 8.1 Windows RT 8.1 Windows 10 Windows Server 2008 Windows Server 2008 R2 Windows