孙广东 2017/4/24
http://blog.csdn.NET/u010019717
主要可以理解为 Unity内截图的几种方式:
这三种方式网上很多文章, 但是有些不知道代码具体是怎么实现的
有几种思路: (我的需求是截图然后作为UI 的假背景使用)
1,通过Application.CaptureScreenshot来截图,这种方式最简单,一行代码搞定,缺点也很明显,比如不能选择区域,不能选择图片格式,不能屏蔽某些对象等等;
要实现我的需求,只能先保存到本地然后再中本地加载!
2,通过Texture2D.ReadPixels来读取屏幕区域像素,然后通过EncodeToJPG/EncodeToPNG编码,最后创建文件保存,步骤繁琐,但可控性更高;
注:这个不知道怎么弄,但是真的很需要这个 , 偶偶,限制必须要在OnGUI 中才行! 《游戏设计 实验笔记》中有在OnGUI 中的Demo 但是会有啊!提示不应该放到这里 官方给的例子https://docs.unity3d.com/ScriptReference/Texture2D.ReadPixels.html 是在OnPostRender() 函数中实现的!!!!!
哈哈,找到解决方案了, 在协程中:
void Start() { StartCoroutine(CapTexture()); } private void Update() { if (Input.GetKeyDown(KeyCode.A)) { StartCoroutine(CapTexture()); } }
IEnumerator CapTexture() { // 关键就是这个等待!!!!!! yield return new WaitForEndOfFrame();
Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false); texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); texture.Apply(false, false);
// 最后将这些纹理数据,成一个png图片文件 byte[] bytes = texture.EncodeToPNG();
var picName = Application.dataPath + "/" + "新的测试方式偶.png";
System.IO.File.WriteAllBytes(picName, bytes);
#if UNITY_EDITOR UnityEditor.AssetDatabase.Refresh(); #endif } |
3,通过一个RenderTexture渲染相机内容,然后读取RenderTexture的像素,然后用2.2的方式实现截图,可控性更高,可以增加各种效果,可以实现屏蔽等功能;
// 缺点: 只能得到这个摄像机的内容, 得不到OnGUI 中, UGUI 的overlay模式的内容 Texture2D CaptureCamera(Camera camera, Rect rect) { // 建一个RenderTexture对象 RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 1); // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机 camera.targetTexture = rt; camera.Render();
// 激活这个rt, 并从中中读取像素。 RenderTexture.active = rt; Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false); screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素 screenShot.Apply();
// 重置相关参数,以使用 camera 继续在屏幕上显示 camera.targetTexture = null; //ps: camera2.targetTexture = null; RenderTexture.active = null; // JC: added to avoid errors GameObject.Destroy(rt);
//=========================保存图片,是非必须的!============================= // 最后将这些纹理数据,成一个png图片文件 byte[] bytes = screenShot.EncodeToPNG();
// 获取系统时间 System.DateTime now = new System.DateTime(); now = System.DateTime.Now; string picName = string.Format("image{0}{1}{2}{3}.png", now.Day, now.Hour, now.Minute, now.Second);
picName = Application.dataPath + "/" + picName;
System.IO.File.WriteAllBytes(picName, bytes); Debug.Log(string.Format("截屏了一张照片: {0}", picName));
#if UNITY_EDITOR UnityEditor.AssetDatabase.Refresh(); #endif //=========================保存图片,是非必须的!============================= return screenShot; } |