β

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

K-Res的Blog 142 阅读

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操作,确保了在调用 微信 分享 图片时,截图图片的可用性!

作者:K-Res的Blog
十年乡下技术博客
原文地址:Unity3D游戏实现微信分享截图功能, 感谢原作者分享。

发表评论