Unity3d C# 开发微信小游戏截图分享功能实现(含源码)

前言

分享是游戏推广的的重要基石之一,它在游戏传播中扮演着重要的角色。分享的意义包含了许多方面,其中最重要的是促进用户彼此沟通和交流,同时对游戏方可以增加游戏的用户规模,增加用户粘度。
这里就先分享一下我自己开发的个小游戏(方便的话,点进去体验一下,拜托了):
在这里插入图片描述

之前笔者也进行了“Unity3d C# 开发微信小游戏分享图片、朋友圈等功能实现”的整理,需要的可以先移步查看。
截图分享给好友的功能,能直观分享展示游戏内的画面,是比较常用的方式,虽然Unity3d也可以截图,但是主体还是微信这边的分享,所以还是要用微信提供的接口(Canvas.toTempFilePath(Object object)或者Canvas.toTempFilePathSync(Object object))实现,具体实现在下文进行讲述,还有一定的限制进行说明。

实现

这里以大厅的分享按钮进行截图分享为例进行讲解,即大厅中放置一个分享的按钮UI,点击后对大厅的场景进行截图,然后分享。大厅场景如下:
在这里插入图片描述

这里我们想截取场景中的,车辆附近的位置来分享:

在这里插入图片描述

这里的位置需要控制如下参数来实现范围的:

x = 0,
y = 0,
width = 375,
height = 300,
destWidth = 375,
destHeight = 300,

x是截取 canvas 的左上角横坐标(就是截图的起始x坐标);
y是截取 canvas 的左上角纵坐标(就是截图的起始y坐标);
width 截取 canvas 的宽度;
height截取 canvas 的高度;
destWidth 目标文件的宽度,会将截取的部分拉伸或压缩至该数值;
destHeight 目标文件的高度,会将截取的部分拉伸或压缩至该数值。

这里有个坑点就是,我之前采用WX.GetSystemInfoSync(); 的方式进行获取屏幕宽度和高度,就行换算获取的信息在手机和开发工具上都不太对,大家也可以自行测试一下:

var sys= WX.GetSystemInfoSync();
Debug.Log("screenWidth:" + sys.screenWidth);
Debug.Log("screenHeight:" + sys.screenHeight);
Debug.Log("windowWidth:" + sys.windowWidth);
Debug.Log("windowHeight:" + sys.windowHeight);

而我采用的是Unity的屏幕信息:

 Debug.Log("UnityEngine.Screen.width;" + UnityEngine.Screen.width);
 Debug.Log("UnityEngine.Screen.height;" + UnityEngine.Screen.height);

由于我们分享图的预览基本长宽相等,过于宽的可能显示不全:
在这里插入图片描述

所以要将截图长宽基本一致,我这里按上下中间占比1/3的进行截图:

          int ShareHeight = UnityEngine.Screen.height / 3;
            WXCanvas.ToTempFilePath(new WXToTempFilePathParam()
            {
    
    
                x = (Screen.width-ShareHeight) / 2,
                y = ShareHeight,
                width = ShareHeight,
                height = ShareHeight,
                destWidth = ShareHeight,
                destHeight = ShareHeight,
                success = (result) =>
                {
    
    
                    Debug.Log("ToTempFilePath success" + JsonUtility.ToJson(result));
                    WX.ShareAppMessage(new ShareAppMessageOption()
                    {
    
    
                        title = "这是你的标题",
                        imageUrl = result.tempFilePath,
                    });
                },
                fail = (result) =>
                {
    
    
                    Debug.Log("ToTempFilePath fail" + JsonUtility.ToJson(result));
                },
                complete = (result) =>
                {
    
    
                    Debug.Log("ToTempFilePath complete" + JsonUtility.ToJson(result));
                },
            });

发送的效果如下:
在这里插入图片描述

按官方的文档你也可以采用如下同步方式进行(笔者未验证):

           int ShareHeight = UnityEngine.Screen.height / 3;
            var tf = WXCanvas.ToTempFilePathSync(new WXToTempFilePathParam()
            {
    
    
                x = (Screen.width - ShareHeight) / 2,
                y = ShareHeight,
                width = ShareHeight,
                height = ShareHeight,
                destWidth = ShareHeight,
                destHeight = ShareHeight,
            });
            WX.ShareAppMessage(new ShareAppMessageOption()
            {
    
    
                title = "这是你的标题",
                imageUrl = tf,
            });

其它参数:
fileType 目标文件的类型有两种jpg和png,默认png。
quality jpg图片的质量,仅当 fileType 为 jpg 时有效。取值范围为 0.0(最低)- 1.0(最高),不含 0。不在范围内时当作 1.0。

特别注意的是这个截取的图只是个临时文件,也就是将当前截图设定的画布(Canvas) 保存为一个临时文件。
如果使用了开放数据域,则生成后的文件仅能被用于以下接口:

wx.saveImageToPhotosAlbum、
wx.shareAppMessage、
wx.onShareAppMessage、
wx.previewImage、
wx.previewMedia、
wx.onShareTimeline、
wx.showShareImageMenu

猜你喜欢

转载自blog.csdn.net/qq_33789001/article/details/132109469