Unity3D游戏实现微信分享截图功能

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<<处理后发布,原文只有博主可以看到。