在研究 unity的截屏功能时,网上搜到的实现截屏功能一般就是三个方式:
1、使用unity引擎自带的截屏API;
2、读取unity渲染缓存数据的方式;
3、通过unity相机设置渲染画面。
在这说一下第二种方法实现截屏功能的试验总结:
A、因为这种截屏的方式利用的是界面渲染的缓存数据,所以使用这种方式实现截屏的前提条件是需要在界面渲染完成后才可以调用这个截屏的方法,否则可能会导致界面渲染数据不完整,截屏的图片出现缺失等异常。
B、如果截屏功能要实现截取部分界面的功能,那么在需要明确 Rect 和 Texture2D 区域大小,一般是 Texture2D 的区域小于或者等于 Rect。ReadPixels API 的参数分别是 Rect 的大小以及 x,y 的偏移量,所以当 Texture2D 的长宽大于 Rect 时,读取渲染缓存不成功。
上测试代码
private IEnumerator PrintScreen()
{
yield return new WaitForEndOfFrame();
Rect rect = new Rect((Screen.width - width) / 2, (Screen.height - height) / 2, Screen.width, Screen.height);
Texture2D screenShot = new Texture2D(width, height);
screenShot.ReadPixels(rect, 0, 0);
screenShot.Apply();
byte[] picBytes = screenShot.EncodeToJPG();
File.WriteAllBytes(path, picBytes);
}