一、后台开通以下功能
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改展示样式。

2981

被折叠的 条评论
为什么被折叠?



