U3D 三种实现截屏保存精彩瞬间方式

在Unity3D,实现截屏的三种实现方式:

/// <summary>
	/// 使用Application类下的CaptureScreenshot()方法实现截图
	/// 优点:简单,可以快速地截取某一帧的画面、全屏截图
	/// 缺点:不能针对摄像机截图,无法进行局部截图
	/// </summary>
	/// <param name="mFileName">M file name.</param>
	private void CaptureByUnity(string mFileName)
	{
		Application.CaptureScreenshot(mFileName,0);
	}

	/// <summary>
	/// 根据一个Rect类型来截取指定范围的屏幕
	/// 左下角为(0,0)
	/// </summary>
	/// <param name="mRect">M rect.</param>
	/// <param name="mFileName">M file name.</param>
	private IEnumerator CaptureByRect(Rect mRect,string mFileName)
	{
		//等待渲染线程结束
		yield return new WaitForEndOfFrame();
		//初始化Texture2D
		Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);
		//读取屏幕像素信息并存储为纹理数据
		mTexture.ReadPixels(mRect,0,0);
		//应用
		mTexture.Apply();
		
		
		//将图片信息编码为字节信息
		byte[] bytes = mTexture.EncodeToPNG();  
		//保存
		System.IO.File.WriteAllBytes(mFileName, bytes);
		
		//如果需要可以返回截图
		//return mTexture;
	}

	private IEnumerator  CaptureByCamera(Camera mCamera,Rect mRect,string mFileName)
	{
		//等待渲染线程结束
		yield return new WaitForEndOfFrame();

		//初始化RenderTexture
		RenderTexture mRender=new RenderTexture((int)mRect.width,(int)mRect.height,0);
		//设置相机的渲染目标
		mCamera.targetTexture=mRender;
		//开始渲染
		mCamera.Render();
		
		//激活渲染贴图读取信息
		RenderTexture.active=mRender;
		
		Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);
		//读取屏幕像素信息并存储为纹理数据
		mTexture.ReadPixels(mRect,0,0);
		//应用
		mTexture.Apply();
		
		//释放相机,销毁渲染贴图
		mCamera.targetTexture = null;   
		RenderTexture.active = null; 
		GameObject.Destroy(mRender);  
		
		//将图片信息编码为字节信息
		byte[] bytes = mTexture.EncodeToPNG();  
		//保存
		System.IO.File.WriteAllBytes(mFileName,bytes);
		
		//如果需要可以返回截图
		//return mTexture;
	}

}

 接下来,我们来调用这三个方法实现一个简单的截图的例子:

//定义图片保存路径
	private string mPath1;
	private string mPath2;
	private string mPath3;

	//相机
	public Transform CameraTrans;

	void Start()
	{
		//初始化路径
		mPath1=Application.dataPath+"\\ScreenShot\\ScreenShot1.png";
		mPath2=Application.dataPath+"\\ScreenShot\\ScreenShot2.png";
		mPath3=Application.dataPath+"\\ScreenShot\\ScreenShot3.png";
	}

	//主方法,使用UGUI实现
	void OnGUI()
	{
		if(GUILayout.Button("截图方式1",GUILayout.Height(30))){
			CaptureByUnity(mPath1);
		}
		if(GUILayout.Button("截图方式2",GUILayout.Height(30))){
			StartCoroutine(CaptureByRect(new Rect(0,0,1024,768),mPath2));
		}
		if(GUILayout.Button("截图方式3",GUILayout.Height(30))){
			//启用顶视图相机
			CameraTrans.camera.enabled=true;
			//禁用主相机
			Camera.main.enabled=false;
			StartCoroutine(CaptureByCamera(CameraTrans.camera,new Rect(0,0,1024,768),mPath3));
		}
	}


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值