打开游戏圈和获取用户信息

unity 开发微信小游戏,有一些常用功能,例如微信登录,微信支付,打开游戏圈,获取用户头像、名字等功能,查看对应的开发文档即可,但是在开发过程中还遇到一些坑,特此记录一下打开游戏圈和获取用户权限踩坑

打开游戏圈

创建一个打开游戏圈的按钮,点击按钮跳转微信游戏圈

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
var btn = WXBase.CreateGameClubButton(new WXCreateGameClubButtonParam()
{
    type = GameClubButtonType.image,
    icon = GameClubButtonIcon.light,
    openlink = url,
    style = new GameClubButtonStyle()
    {
        left = left,
        top = top,
        width = w,
        height = h
    }
});

获取用户信息

获取用户信息之前,需要判断用户是否授权

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
WX.GetSetting(new GetSettingOption()
{
    success = (res) =>
    {
        var isAuth = res != null
          && res.authSetting.ContainsKey("scope.userInfo")
          && res.authSetting["scope.userInfo"];
        callback.Invoke(isAuth);
    }
});

如果已经授权,便可直接读取用户信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
WX.GetUserInfo(new GetUserInfoOption()
{
    success = (res) =>
    {
        if (res == null || res.userInfo == null)
        {
            callback.Invoke(null, null);
            return;
        }

        var name = res.userInfo.nickName;
        var avatar = res.userInfo.avatarUrl;
        callback.Invoke(name, avatar);
    },
    fail = (res) =>
    {
        callback.Invoke(null, null);
    }
});

如果未授权,需要调用微信插件提供的CreateUserInfoButton方法创建一个透明按钮,用户点击按钮,会弹出授权弹框,所以最好将按钮覆盖在功能按钮上,例如打开排行榜需要读取用户头像,用户还未授权,就应该将透明按钮覆盖在排行榜按钮上

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
var btn = WXBase.CreateUserInfoButton(left, top, w, h, "zh_CN", false);
btn.OnTap((res) =>
{
    // 拒绝授权
    if (res.errCode != 0)
    {
        callback.Invoke(null, null);
        return;
    }
    
    callback.Invoke(res.userInfo.nickName, res.userInfo.avatarUrl);
    btn.Hide();
});

小技巧

因为授权按钮是透明的,很不好调试,在微信开发者工具中,鼠标移动到授权按钮的时候,鼠标会从圈变成箭头

鼠标变化

坑点

创建游戏圈按钮和授权按钮,都需要指定按钮的位置

  • left 相对屏幕左上角的 x 坐标
  • top 相对屏幕左上角的 y 坐标
  • width 按钮宽度
  • height 按钮高度

区别:

  • CreateGameClubButton 创建游戏圈按钮,是相对于逻辑分辨率,需要通过 GetSystemInfoOption 获取

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    WX.GetSystemInfo(new GetSystemInfoOption()
    {
        success = (info) =>
        {
          var dpr = info.pixelRatio;
          var width = info.screenWidth;
          var height = info.screenHeight;
        }
    });
    
  • CreateUserInfoButton 创建授权按钮,是相对于物理分辨率,在 unity 中通过 Screen.widthScreen.height 获得物理分辨率

分辨率区别

  • 物理分辨率:物理设备真实的像素点,例如iphone 14 pro max, 物理分辨率 1290*2796
  • 逻辑分辨率:为了抹平物理分辨率的差异,更好的做界面适配,在物理分辨率上层抽象出来的一个概念,例如iphone 14 pro max,逻辑分辨率 430*932

物理分辨率和逻辑分辨率的比值,即 Dpr=物理分辨率/逻辑分辨率,iphone 14 pro max 的 Dpr = 3

12.91k 字
12篇文章