Unity3D本身内置了一个截屏并保存为图片的功能:
public static void CaptureScreenshot(string filename, int superSize = 0);
然而,在配合微信做截屏分享的时候,发现这个简单的静态函数并不能顺利实现功能逻辑,关键原因在于这个函数的实现是异步的,也就是说,你想要的截图并不会在这个函数调用后立即生成!尤其是在移动平台上,这个函数的延迟可能更大,而且更悲剧的是:这个函数并没有让调用方知道截图生成ok了的机制,比如回调等,所以,在参考了网上的资料后,还是自己实现了一个截图保存的方法:
StartCoroutine(CaptureScreen()); ... public IEnumerator CaptureScreen() { string ssname = "lastss.png"; string sspath = Path.Combine(Application.temporaryCachePath, ssname); if (File.Exists(sspath)) { File.Delete(sspath); Debug.Log(ssname + " deleted first!"); } Texture2D texture1; byte[] bytes; // Wait for screen rendering to complete yield return new WaitForEndOfFrame(); texture1 = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false); texture1.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); texture1.Apply(); yield return 0; bytes = texture1.EncodeToPNG(); File.WriteAllBytes(sspath, bytes); Debug.Log("Screenshot saved: " + sspath); DoWeChatShareImage(sspath, "img", true); }
这个函数以协同异步方式实现,首先等待EndOfFrame,确保所有渲染操作完成,然后通过ReadPixels读取渲染完成的帧缓冲上的像素信息,并生成PNG图片保存到指定路径(这里我用的是应用的cache路径,随时可被清除!),这样通过一个同步的文件IO操作,确保了在调用微信分享图片时,截图图片的可用性!
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。