好了,欣赏完美丽的风景,下面我们就来一起洞慧纯学习在Unity3D实现截屏,先给出实现截屏的三种实现方式:
[csharp] view plaincopyprint?
/// <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
}
}
接下来,纳咐我们来调用这三个方法实现一个简单的截图的例子:
[csharp] view plaincopyprint?
//定义图片保存路径
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))
}
}
在第三中截图方式中,在场景里放了一个名为TopCamera的摄像机,它垂直向下投影到游戏场景里,这样可以使玩家看到场景的顶视图。这里我们用这个相机来测试第三个方法,此时需要先激活该相机。场景设置如图:我们下面来看三种方法截图的效果:
据我所知,可以用下面的方法:1 内置方法(简单有效,但是貌似不能够自定义存储路径等等):物腊
Application.CaptureScreenshot ("Screenshot.png")
2 自己写一个方法读点(用的是类似流的思路还算比较灵活,但是存大图会卡,推荐图像类型慎重选择)
IEnumerator OnScreenCapture ()
{
yield return new WaitForEndOfFrame()//等待这一帧画完了才能截图
try
{
int width = Screen.width
int height = Screen.height
Texture2D tex = new Texture2D ( width, height, TextureFormat.RGB24, false)//新建一张图
tex.ReadPixels (new Rect (0, 0, width, height), 0, 0, true)//从屏幕开始读点
byte[] imagebytes = tex.EncodeToJPG ()//用的是JPG(这种比较小)
//使用它压缩实时产生的纹理,压缩过的纹理使用更少的显存并可以更快罩孝滑的被渲染
//通过true为highQuality参数将抖动压缩期间源纹理,这有助于减少压缩伪像
//因为压缩后的图像不作为纹理使用,只是一张用于展慎裤示的图
//但稍微慢一些这个小功能暂时貌似还用不到
tex.Compress (false)
tex.Apply()
Texture2D mScreenShotImgae = tex
File.WriteAllBytes ( @"E:\Screenshot.png", imagebytes)
}
catch (System.Exception e)
{
Debug.Log ("ScreenCaptrueError:" + e)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)