当前位置:   article > 正文

Unity制作微信小游戏(1)- 好友排行榜(多榜单)_uniyt接入微信好友排行

uniyt接入微信好友排行

目录

1.初衷

2.插件

3.好友排行榜

4.注意事项

5.个人作品


1.初衷

        有了Unity转换微信小游戏的插件后,就想着做一款自己的小游戏,跑了一遍开发流程,最终也顺利上线;过程中碰到不少各种各样的坑,记录一下,也许能帮到一些想做的朋友。

        书写顺序随心所欲,本文先讲好友排行榜

2.插件

        官方插件链接

3.好友排行榜

        官方有排行榜的示例(如下图),大家有空去下载看一下,很多博客都有做详情介绍,就不多做介绍了

        这里主要讲一下多榜单怎么实现(如下图所示:记录两个不同的数据在榜中显示)

        官方插件提供的仅支持单榜,但是多榜单要怎么做呢?

        先看一下插件导入后的层次结构,如下图:

        这里open-data即为显示排行榜数据的开放数据域模块,我们需要改动以下几个地方(仅做参照):

        1)index.js:

          A.MessageType新增4个枚举

  1. // setUserRecord(RANK_KEY, Math.ceil(Math.random() * 1000)); // 屏蔽测试数据
  2. const MessageType = {
  3. WX_RENDER: 'WXRender',
  4. WX_DESTROY: 'WXDestroy',
  5. SHOW_FRIENDS_RANK: 'showFriendsRank',
  6. SHOW_GROUP_FRIENDS_RANK: 'showGroupFriendsRank',
  7. SET_USER_RECORD: 'setUserRecord',
  8. // -------------------------------- < 新增4个显示枚举 > --------------------------------
  9. SHOW_FRIENDS_CHALLENGE_RANK: 'showFriendsChallengeRank',
  10. SHOW_FRIENDS_HIDE_RANK: 'showFriendsHideRank',
  11. SHOW_GROUP_FRIENDS_CHALLENGE_RANK: 'showGroupFriendsChallengeRank',
  12. SHOW_GROUP_FRIENDS_HIDE_RANK: 'showGroupFriendsHideRank',
  13. // -------------------------------- < 新增4个显示枚举 > --------------------------------
  14. };

         B.main函数改为如下

  1. function main() {
  2. wx.onMessage((data) => {
  3. console.log('[WX OpenData] onMessage', data);
  4. if (typeof data === 'string') {
  5. try {
  6. // eslint-disable-next-line no-param-reassign
  7. data = JSON.parse(data);
  8. }
  9. catch (e) {
  10. console.error('[WX OpenData] onMessage data is not a object');
  11. return;
  12. }
  13. }
  14. switch (data.type) {
  15. // 来自 WX Unity SDK 的信息
  16. case MessageType.WX_RENDER:
  17. initOpenDataCanvas(data);
  18. break;
  19. // 来自 WX Unity SDK 的信息
  20. case MessageType.WX_DESTROY:
  21. Layout.clearAll();
  22. break;
  23. // 下面为业务自定义消息
  24. case MessageType.SHOW_FRIENDS_RANK:
  25. renderFriendsRank(1);
  26. break;
  27. case MessageType.SHOW_FRIENDS_CHALLENGE_RANK:
  28. renderFriendsRank(2);
  29. break;
  30. case MessageType.SHOW_FRIENDS_HIDE_RANK:
  31. renderFriendsRank(3);
  32. break;
  33. case MessageType.SHOW_GROUP_FRIENDS_RANK:
  34. renderGroupFriendsRank(data.shareTicket, 1);
  35. break;
  36. case MessageType.SHOW_GROUP_FRIENDS_CHALLENGE_RANK:
  37. renderGroupFriendsRank(data.shareTicket, 2);
  38. break;
  39. case MessageType.SHOW_GROUP_FRIENDS_HIDE_RANK:
  40. renderGroupFriendsRank(data.shareTicket, 3);
  41. break;
  42. case MessageType.SET_USER_RECORD:
  43. let extra = {challenge:data.challenge, hide:data.hide};
  44. setUserRecord(RANK_KEY, data.score, extra);
  45. break;
  46. default:
  47. console.error(`[WX OpenData] onMessage type 「${data.type}」 is not supported`);
  48. break;
  49. }
  50. });
  51. }

        2)data/index.js:

         A.getWxGameData函数改为如下

  1. function getWxGameData(item) {
  2. let source;
  3. try {
  4. source = JSON.parse(item.KVDataList[0].value);
  5. }
  6. catch (e) {
  7. source = {
  8. wxgame: {
  9. score: 0,
  10. update_time: getCurrTime(),
  11. },
  12. };
  13. }
  14. // return source.wxgame;
  15. return source;
  16. }

         B.以下3个函数新增参数showType及相应的改动,详见如下

  1. function rankDataFilter(res, showType = 1, selfUserInfo = false) {
  2. const data = (res.data || []).filter((item) => item.KVDataList && item.KVDataList.length);
  3. return data
  4. .map((item) => {
  5. let data = getWxGameData(item);
  6. console.log('[WX OpenData] rankDataFilter() data: ', data);
  7. // const { score, update_time: updateTime } = data.wxgame.score;
  8. let score = data.wxgame.score;
  9. switch (showType)
  10. {
  11. case 1:
  12. score = data.wxgame.score;
  13. break;
  14. case 2:
  15. score = data.challenge;
  16. break;
  17. case 3:
  18. score = data.hide;
  19. break;
  20. default:
  21. console.error(`[WX OpenData][Error] rankDataFilter() showType: ${showType} is not case!`);
  22. }
  23. const updateTime = data.wxgame.update_time;
  24. console.log(`[WX OpenData] rankDataFilter() score: ${score}, showType: ${showType}`);
  25. item.score = score;
  26. item.update_time = updateTime;
  27. /**
  28. * 请注意,这里判断是否为自己并不算特别严谨的做法
  29. * 比较严谨的做法是从游戏域将openid传进来,示例为了简化,简单通过 avatarUrl 来判断
  30. */
  31. if (selfUserInfo && selfUserInfo.avatarUrl === item.avatarUrl) {
  32. item.isSelf = true;
  33. }
  34. return item;
  35. })
  36. // 升序排序
  37. .sort((a, b) => b.score - a.score);
  38. }
  39. /**
  40. * 获取好友排行榜列表
  41. * API文档可见:https://developers.weixin.qq.com/minigame/dev/api/open-api/data/wx.getFriendCloudStorage.html
  42. */
  43. export function getFriendRankData(key, showType, needMarkSelf = true) {
  44. console.log('[WX OpenData] getFriendRankData with key: ', key);
  45. return getFriendCloudStorage({
  46. keyList: [key],
  47. }).then((res) => {
  48. console.log('[WX OpenData] getFriendRankData success: ', res);
  49. if (needMarkSelf) {
  50. getSelfPromise = getSelfPromise || getSelfData();
  51. return getSelfPromise.then(userInfo => rankDataFilter(res, showType, userInfo));
  52. }
  53. return rankDataFilter(res, showType);
  54. });
  55. }
  56. /**
  57. * 获取群同玩成员的游戏数据。小游戏通过群分享卡片打开的情况下才可以调用。该接口需要用户授权,且只在开放数据域下可用。
  58. * API文档可见: https://developers.weixin.qq.com/minigame/dev/api/open-api/data/wx.getGroupCloudStorage.html
  59. */
  60. export function getGroupFriendsRankData(shareTicket, key, showType, needMarkSelf = true) {
  61. console.log('[WX OpenData] getGroupFriendsRankData with shareTicket and key: ', shareTicket, key);
  62. return getGroupCloudStorage({
  63. shareTicket,
  64. keyList: [key],
  65. }).then((res) => {
  66. console.log('[WX OpenData] getGroupFriendsRankData success: ', res);
  67. if (needMarkSelf) {
  68. getSelfPromise = getSelfPromise || getSelfData();
  69. return getSelfPromise.then(userInfo => rankDataFilter(res, showType, userInfo));
  70. }
  71. return rankDataFilter(res, showType);
  72. });
  73. }

        3)render/styles/friendRank.js:用来设置图片的显示位置、长宽、圆角等;这里可以参照原有改动

        4)render/tpls/friendRank.js:用来设置显示的xml,配合上面一条

  1. export default function anonymous(it, showType) {
  2. let out = '<view class="container" id="main"> <view class="rankList"> <scrollview class="list" scrollY="true"> ';
  3. const arr1 = it.data;
  4. if (arr1) {
  5. let item;
  6. let index = -1;
  7. const l1 = arr1.length - 1;
  8. while (index < l1) {
  9. item = arr1[(index += 1)];
  10. let rankIndex = index + 1;
  11. // let name = item.nickname + item.nickname + item.nickname;
  12. let name = item.nickname;
  13. let itemIconIndex = showType;
  14. out += ` <view class="listItem"> <image src="open-data/render/image/rankBg.png" class="rankBg"></image> <text class="rankIndex" value="${rankIndex}"></text>`;
  15. if (rankIndex <= 3)
  16. out += `<image class="rankMark" src="open-data/render/image/ui_rank${rankIndex}.png"></image>`;
  17. out += ` <image class="rankAvatarBg" src="open-data/render/image/rankAvatar.png"></image> <image class="rankAvatar" src="${item.avatarUrl}"></image> <text class="rankName" value="${name}"></text> <text class="rankScoreVal" value="${(item.score || 0) + (itemIconIndex > 1 ? ' 关' : '')}"></text>`;
  18. if (itemIconIndex == 1)
  19. out += `<image class="rankItemIcon1" src="open-data/render/image/ui_item1.png"></image>`;
  20. // else if (itemIconIndex == 2)
  21. // out += `<image class="rankItemIcon2" src="open-data/render/image/ui_item2.png"></image>`;
  22. out += `</view>`;
  23. }
  24. }
  25. out += ' </scrollview> </view></view>';
  26. return out;
  27. }

        5)render/image:排行榜的显示图片,配合以上两条

        6)Unity端调用:

  1. [System.Serializable]
  2. public class OpenDataMessage
  3. {
  4. public string type;
  5. public string shareTicket;
  6. public int score;
  7. public int challenge;
  8. public int hide;
  9. }
  10. public void SetFriendRankData(int score, int challenge, int hide)
  11. {
  12. OpenDataMessage msgData = new OpenDataMessage();
  13. msgData.type = "setUserRecord";
  14. msgData.score = score;
  15. msgData.challenge = challenge;
  16. msgData.hide = hide;
  17. string msg = LitJson.JsonMapper.ToJson(msgData);
  18. WX.GetOpenDataContext().PostMessage(msg);
  19. }

4.注意事项

        1)可以在Unity转换为小游戏后,在微信开发者工具里直接改open-data里的内容,便于运行查看;调整完成后,记得把open-data文件夹替换Unity里WX-WASM-SDK-V2文件夹下的同名目录

        2)要显示开放数据域的内容,需要用到小程序插件:开放数据域渲染库,记得添加

        3)game.json中添加如下插件

  1. "Layout" : {
  2. "version" : "1.0.7",
  3. "provider" : "wx7a727ff7d940bb3f",
  4. "contexts" : [
  5. {
  6. "type" : "openDataContext"
  7. }
  8. ]
  9. }

        4)每次更新小程序转换插件时,一般来说open-data不用导入(不然还得自己比对,把改动的内容找回来)

5.个人作品

        小游戏:小小狼吃羊 

        感兴趣的可以玩玩看^_^

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/669244
推荐阅读
相关标签
  

闽ICP备14008679号