一、 局部截图
public RectTransform UIRect;
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
string fileName = Application.dataPath + "/StreamingAssets/" + "123.png";
//系统不识别标点符号,但支持中文
IEnumerator coroutine = CaptureByUI(UIRect, fileName);
StartCoroutine(coroutine);
}
}
public IEnumerator CaptureByUI(RectTransform UIRect, string mFileName)
{
//等待帧画面渲染结束
yield return new WaitForEndOfFrame();
int width = (int)(UIRect.rect.width );
int height = (int)(UIRect.rect.height);
Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
//左下角为原点(0, 0)
float leftBtmX = UIRect.transform.position.x + UIRect.rect.xMin ;
float leftBtmY = UIRect.transform.position.y + UIRect.rect.yMin ;
//从屏幕读取像素, leftBtmX/leftBtnY 是读取的初始位置,width、height是读取像素的宽度和高度
tex.ReadPixels(new Rect(leftBtmX, leftBtmY, width, height), 0, 0);
//执行读取操作
tex.Apply();
byte[] bytes = tex.EncodeToPNG();
//保存
System.IO.File.WriteAllBytes(mFileName, bytes);
}
在Canvas下新建一个Image,这个Image的所在区域,按下空格即可截取Image所在的区域。
Image的透明度可以为0 在右下角可以设置锚点为右下角 设置固定的分辨率即可。
二、 全屏截图
1. unity内置了一种非常简单的截图方法,截取的某一帧的画面。
public void CaptureScreenByUnity(string fileName)
{
UnityEngine.ScreenCapture.CaptureScreenshot(fileName);
}
2. 利用局部截图里面的方法,设置一个覆盖全屏的UI组件,也可实现全屏截图。
3. 利用OnPostRender方法进行截图, OnPostRender是Camera类下的方法,所以要想执行该方法,脚本必须挂载在相机下面。截取的画面是相机画面,如果Canvas的RenderMode为默认的ScreenSpace-Overlay,截图是不带UI元素的。
//该脚本必须附加在Camera相机组件所在物体对象上OnPostRender方法才会执行
//当camera完成场景的渲染时会被激活执行
private void OnPostRender()
{
if (grab)
{
//创建一个设置好的屏幕宽度和高度
//Screen.width 和 Screen.height 为在game窗口设置的宽度和高度
Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
//Read the pixels in the Rect starting at 0,0 and ending at the screen's width and height
texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, false);
texture.Apply();
byte[] bytes = texture.EncodeToPNG();
//保存
System.IO.File.WriteAllBytes(fileName, bytes);
grab = false;
}
}
三、带UI截图(利用RenderTexture截图)
需要新建一个Canvas,RenderMode设置为ScreenSpace-Camera,把需要出现在截图当中的元素放在该Canvas下面。然后在新建一个专门进行截图的Camera。设置该Camera为Canvas的渲染相机RenderCamera。
public void CaptureScreenByRT(Camera camera, string fileName)
{
Rect rect = new Rect(0, 0, 1920, 1080);
// 创建一个RenderTexture对象
RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
// 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机
camera.targetTexture = rt;
camera.Render();
// 激活这个rt, 并从中中读取像素。
RenderTexture.active = rt;
Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
// 注:这个时候,它是从RenderTexture.active中读取像素
screenShot.ReadPixels(rect, 0, 0);
screenShot.Apply();
// 重置相关参数,以使用camera继续在屏幕上显示
camera.targetTexture = null;
RenderTexture.active = null;
GameObject.Destroy(rt);
// 最后将这些纹理数据,成一个png图片文件
byte[] bytes = screenShot.EncodeToPNG();
System.IO.File.WriteAllBytes(fileName, bytes);
}
错误信息:[d3d11] attempting to ReadPixels outside of RenderTexture bounds!
设置固定分辨率 调整RenderTexture的锚点即可
@Liam:有用→收藏→关注 听说长得好看的人都这么做!