Unity开发微信小游戏,接入微信排行榜

一、后台开通以下功能

1. 账号设置中

2. 开通排行榜

记录此唯一标识,我的这里是level。

二、发送给微信需要被排行榜的数据

先不管为什么这么写。

    public async UniTask<OpenDataMessage> SET_USER_RECORD(int level)
    {
        OpenDataMessage message = new OpenDataMessage();
        message.type = "setUserRecord";
        message.score = level;
        
        string msg = JsonUtility.ToJson(message);
        
        Debug.Log(msg);
        InitOpenDataContext();
        openDataContext.PostMessage(msg);
        return message;
    }

    void InitOpenDataContext()
    {
        if (openDataContext == null)
        {
            openDataContext = WX.GetOpenDataContext(new OpenDataContextOption
            {
                sharedCanvasMode = CanvasType.ScreenCanvas
            });
        }
    }

如果需要分享群排行功能:

在你的系统的初始化中调用GroupSharedInit

/// <summary>
    /// 初始化群排行榜分享
    /// </summary>
    void GroupSharedInit()
    {
        /**
         * 使用群排行功能需要特殊设置分享功能,详情可见链接
         * https://developers.weixin.qq.com/minigame/dev/guide/open-ability/share/share.html
         */
        WX.UpdateShareMenu(new UpdateShareMenuOption()
        {
            withShareTicket = true,
            isPrivateMessage = true,
        });

        /**
         * 群排行榜功能需要配合 WX.OnShow 来使用,整体流程为:
         * 1. WX.UpdateShareMenu 分享功能;
         * 2. 监听 WX.OnShow 回调,如果存在 shareTicket 且 query 里面带有启动特定 query 参数则为需要展示群排行的场景
         * 3. 调用 WX.ShowOpenData 和 WX.GetOpenDataContext().PostMessage 告知开放数据域侧需要展示群排行信息
         * 4. 开放数据域调用 wx.getGroupCloudStorage 接口拉取获取群同玩成员的游戏数据
         * 5. 将群同玩成员数据绘制到 sharedCanvas
         */
        WX.OnShow((OnShowListenerResult res) =>
        {
            string shareTicket = res.shareTicket;
            Dictionary<string, string> query = res.query;

            if (!string.IsNullOrEmpty(shareTicket) && query != null && query["action"] == "show_group_rank")
            {
                // OpenDataMessage msgData = OpenDataMessage.SHOW_GROUP_FRIENDS_RANK(shareTicket);
                //
                // string msg = JsonUtility.ToJson(msgData);
                // // 展示排行榜
                // this.ShowOpenData();
                // // 通知开放数据域
                // WX.GetOpenDataContext().PostMessage(msg);
                InitOpenDataContext();
                ShowOpenData();

                OpenDataMessage msgData = new OpenDataMessage();
                msgData.type = "showGroupFriendsRank";
                msgData.shareTicket = shareTicket;

                string msg = JsonUtility.ToJson(msgData);

                openDataContext.PostMessage(msg);
            }
        });
    }

三、调用展示好友排行榜

只看和WXSDK有关即可,其他都是UI的操作。

    /// <summary>
    /// 显示好友排行榜
    /// </summary>
    public async UniTask ShowRank()
    {
        Debug.Log("WXRankManager 展示排行榜");
        // 渲染数据
        InitOpenDataContext();
        Debug.Log("WXRankManager InitOpenDataContext over");
        ShowOpenData();
        // 通知开放数据域
        OpenDataMessage msgData = new OpenDataMessage();
        msgData.type = "showFriendsRank";
        string msg = JsonUtility.ToJson(msgData);
        openDataContext.PostMessage(msg);

    }

 /// <summary>
    /// 通知开放数据域渲染排行榜
    /// </summary>
    private void ShowOpenData()
    {
        // 显示排行榜相关的Unity-UI
        rankPanelView.RankMask.SetActive(true);
        rankPanelView.RankBox.SetActive(true);
        // 注意这里传x,y,width,height是为了点击区域能正确点击,x,y 是距离屏幕左上角的距离,宽度传 (int)RankBody.rectTransform.rect.width是在canvas的UI Scale Mode为 Constant Pixel Size的情况下设置的。
        /**
         * 如果父元素占满整个窗口的话,pivot 设置为(0,0),rotation设置为180,则左上角就是离屏幕的距离
         * 注意这里传x,y,width,height是为了点击区域能正确点击,因为开放数据域并不是使用 Unity 进行渲染而是可以选择任意第三方渲染引擎
         * 所以开放数据域名要正确处理好事件处理,就需要明确告诉开放数据域,排行榜所在的纹理绘制在屏幕中的物理坐标系
         * 比如 iPhone Xs Max 的物理尺寸是 414 * 896,如果排行榜被绘制在屏幕中央且物理尺寸为 200 * 200,那么这里的 x,y,width,height应当是 107,348,200,200
         * x,y 是距离屏幕左上角的距离,宽度传 (int)RankBody.rectTransform.rect.width是在canvas的UI Scale Mode为 Constant Pixel Size的情况下设置的
         * 如果是Scale With Screen Size,且设置为以宽度作为缩放,则要这要做一下换算,比如canavs宽度为960,rawImage设置为200 则需要根据 referenceResolution 做一些换算
         * 不过不管是什么屏幕适配模式,这里的目的就是为了算出 RawImage 在屏幕中绝对的位置和尺寸
         */
        var rt = rankPanelView.RankBody.rectTransform;

// 1) 世界角点
        var world = new Vector3[4];
        rt.GetWorldCorners(world);

// 2) 转屏幕坐标(Overlay 传 null;Camera/WorldSpace 传对应相机)
        Canvas canvas = rt.GetComponentInParent<Canvas>();
        Camera cam = (canvas != null && canvas.renderMode == RenderMode.ScreenSpaceOverlay) ? null : canvas?.worldCamera;

        var s = new Vector2[4];
        for (int i = 0; i < 4; i++) s[i] = RectTransformUtility.WorldToScreenPoint(cam, world[i]);

// 3) 用包围盒确定真正的左上/右下
        float minX = Mathf.Min(s[0].x, s[1].x, s[2].x, s[3].x);
        float maxX = Mathf.Max(s[0].x, s[1].x, s[2].x, s[3].x);
        float minY = Mathf.Min(s[0].y, s[1].y, s[2].y, s[3].y);
        float maxY = Mathf.Max(s[0].y, s[1].y, s[2].y, s[3].y);

// 4) 转为微信坐标(左上为原点),并取整到物理像素
        int x = Mathf.RoundToInt(minX);
        int y = Mathf.RoundToInt(Screen.height - maxY);
        int w = Mathf.RoundToInt(maxX - minX);
        int h = Mathf.RoundToInt(maxY - minY);

// 5) 显示开放数据域
        WX.ShowOpenData(rankPanelView.RankBody.texture, x, y, w, h);
    }

四、隐藏好友排行榜

/// <summary>
    /// 隐藏排行榜
    /// </summary>
    public async UniTask HideRank()
    {
        // 隐藏排行榜相关实体
        rankPanelView.RankMask.SetActive(false);
        rankPanelView.RankBox.SetActive(false);
        Debug.Log("隐藏排行榜");
        // 调用WX-API通知开放数据域执行隐藏操作,防止一些材质混乱问题
        WX.HideOpenData();
        
        gameObject.SetActive(false);
    }

五、UGUI部分

关键在于这个RawImage,RawImage用一个像素的透明图片即可,微信会将信息绘制在这张RawImage上,注意Rotation要旋转180度。

六、打包部分

必须勾选:

这样导出后才会将wxSDK中的OpenData复制到打包后的项目中。

七、编写打包后的js、css等代码,用于展示RawImage范围内的排行榜内容

主要是这部分,js改内容布局,css改展示样式。

八、编辑器运行后,提示安装排行榜需要的插件

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值