Unity3D游戏开发之如何截屏的技能培训

Unity3D游戏开发之如何截屏的技能培训,第1张

好了,欣赏完美丽的风景,下面我们就来一起洞慧纯学习在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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8251141.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存