大数跨境
0
0

《火拼24》系列教程五(下):获取微信昵称作为角色名

《火拼24》系列教程五(下):获取微信昵称作为角色名 UOS游戏云服务
2025-08-22
2
导读:想让微信授权后,昵称立刻出现在游戏界面?本文详解从授权到UI同步全流程!

在社交属性极强的游戏领域,为微信用户提供流畅体验是吸引玩家的关键要素。你是否渴望实现这样的场景:微信用户完成授权后,其昵称能瞬间呈现在游戏界面上,让玩家能够立刻以熟悉的身份畅快游玩?

《火拼24》系列教程的本篇,将带你了解从授权触发到 UI 同步的全流程,助你轻松打造“授权完成即显示昵称”的丝滑体验!

教程视频

教程学习大纲

1. 微信后台配置《用户隐私保护指引》和开启隐私授权弹窗

2. 激活获取微信昵称的弹窗

3. 获取微信的昵称并显示在 UI 界面上

教程操作步骤

温馨提醒:请参照《火拼24》系列教程五(上)《实现微信账号的一键快捷登录》的教程内容,完成其中操作步骤后,再继续本教程的学习哦!

  1. 微信后台隐私配置操作

1.1 微信后台配置《用户隐私保护指引》

首先请大家参考下面链接的微信官方文档中,关于《用户隐私保护》的说明。需要我们先前往微信小游戏后台,配置《用户隐私保护指引》和开启隐私授权的弹窗。

https://developers.weixin.qq.com/minigame/dev/guide/open-ability/privacy.html

登录微信小程序账户后,在页面左下角选择你的账号,点击「账号设置 → 基本设置」,页面往下拉,找到「服务内容声明 →  用户隐私保护指引 →  去完善」,开始配置你的隐私政策。

在弹出窗口中,点击「确认以上内容」

「增加信息类型」这里,添加类型:「获取微信用户的昵称、头像」,并在空格内自行填写使用该信息的用途。

「权益」这里,添加你的联系方式:

自行设置信息存储的期限信息的通知方式

最后,点击「确定并生成协议」

1.2 微信后台开启隐私授权弹窗

前往「服务内容声明 →  隐私授权弹窗 →  设置」,开启授权弹窗。

开启「授权弹窗」后,界面如下图所示。

  2. 微信后台隐私配置操作激活获取微信昵称的弹窗

接下来我们就看看代码中,如何获取授权的微信昵称吧!

2.1 获取微信昵称的 Button

在场景中的创建角色对话框的界面(CreatePersonaDialog)上,找到已经提前创建好的 UI 按钮对象 Button_UseWechatUserName,后面用来获取微信昵称的时候使用。

在初始状态时,该按钮是处于隐藏状态的。

2.2 判断域中是否创建过角色

前面的教程中已经分析过思路:会在游戏启动时检查用户角色信息、初始化游戏数据,并处理不同平台(特别是微信小游戏)的特殊逻辑。

现在,我们来修改 LoadGameData.cs 脚本中的协程方法 CheckPersona:

  • 添加异常处理:检查获取角色的异步任务是否失败,如果失败,记录错误日志并提前结束当前协程,防止程序因为角色获取失败而崩溃。

  • 定义新的变量:

    • persona:存储从服务器获取的角色信息

    • shouldUseExistingPersona:标记是否应该使用现有角色

    • isWechatPlatform:标记当前是否为微信平台

  • 是否微信平台的判断和角色验证策略:

    • 如果是微信平台只有当角色有显示名称(DisplayName)时,才认为是有效角色。因为由于微信小游戏的特殊登录机制,用户可能登录了但未完成角色创建。

    • 如果其他平台:只要有角色对象存在就认为是有效角色。

  • 修改用户已有角色的判断条件:将原来的 if (getPersonaTask.Result != null),修改为:if (shouldUseExistingPersona)。

#if (UNITY_WEIXINMINIGAME || MINIGAME_SUBPLATFORM_WEIXIN) && !UNITY_EDITORusing WeChatWASM;using Unity.UOS.TwentyFour.Wechat;#endif
namespace TwentyFour.Scripts.Gameplay.HomePage{    public class LoadGameData : MonoBehaviour    {        //......
        IEnumerator CheckPersona()        {            string realmID = String.Empty;            Task<string> task = Identity.GetRealmID();            yield return new WaitUntil(()=>task.IsCompleted);            if (!string.IsNullOrEmpty(task.Result))                realmID = task.Result;            Task<Persona> getPersonaTask = PassportSDK.Identity.GetPersonaByRealm(realmID);            yield return new WaitUntil(()=>getPersonaTask.IsCompleted);
            // 异常处理            if (getPersonaTask.IsFaulted) {                Logger.LogError($"获取角色失败: {getPersonaTask.Exception?.Message}");                yield break;            }            Persona persona = getPersonaTask.Result;            bool shouldUseExistingPersona = false;            bool isWechatPlatform = false;#if (UNITY_WEIXINMINIGAME || MINIGAME_SUBPLATFORM_WEIXIN) && !UNITY_EDITOR            isWechatPlatform = true;            // 微信平台:仅当有DisplayName时视为有效角色            shouldUseExistingPersona = !string.IsNullOrEmpty(persona?.DisplayName);#else            // 非微信平台:有角色对象即可            shouldUseExistingPersona = persona != null;#endif
            // 非 external login 且已有 persona            // 或者是 external login 且 persona 已有 display name            if (shouldUseExistingPersona)            {                Identity.CurrentPersona = getPersonaTask.Result;                yield return StartCoroutine(SelectPersonaAndInit());                Logger.Log($"当前角色为:{Identity.CurrentPersona.DisplayName}");            }             else            {                Logger.Log("当前域无角色,请创建新角色");                var createPersonaController = createPersonaDialog.GetComponent<CreatePersona>();                createPersonaController.OnCreatePersonaComplete = OnCreatePersonaComplete;                createPersonaDialog.SetActive(true);                 }        }
        //......          }}

2.3 激活授权昵称的弹窗

当创建角色的弹窗出现时,我们来激活获取微信昵称的按钮。所以,我们修改角色弹窗对象(CreatePersonaDialog)上挂载的 CreatePersona.cs 脚本中的代码:

  • 定义新的变量:

    • getWechatUserInfoButton:表示获取微信昵称的按钮

    • personaNameTextPlaceholder:表示角色昵称输入框的提示符文本框

  • 添加 Start 方法:

    • 当界面一激活,我们在 Start 方法中激活获取微信用户信息的按钮,让用户可以点击授权获取微信昵称。

    • 关闭角色名称的文本输入功能,因为微信平台会自动获取昵称,不再需要手动输入。在输入框中显示提示文字:"请授权微信昵称",告知用户需要通过微信授权来获取昵称。

  • 添加 SetUserName 方法:

    • 提前封装了该方法,用于设置角色名称,会在显示微信昵称的时候调用的。

using System.Collections.Generic;
namespace TwentyFour.Scripts.Features.Player{    public class CreatePersona : MonoBehaviour    {        public InputField personaNameText;        [SerializeFieldprivate GameObject getWechatUserInfoButton;        [SerializeFieldprivate Text personaNameTextPlaceholder;        public LoginController.CreatePersonaCompleteCallback OnCreatePersonaComplete;        void Start()        {#if (UNITY_WEIXINMINIGAME || MINIGAME_SUBPLATFORM_WEIXIN) && !UNITY_EDITOR            getWechatUserInfoButton.SetActive(true);            personaNameText.enabled = false;            personaNameTextPlaceholder.text = "请授权微信昵称";#endif        }
        //......
        public void SetUserName(string userName)        {            personaNameText.text = userName;        }    }}

在 Inspector 面板上,为 CreatePersona.cs 脚本中的变量 getWechatUserInfoButton 和 personaNameTextPlaceholder 赋值。

2.4 在微信开发者工具中运行测试

此时,大家可以自行重新打包小游戏项目工程,并将资源再次上传到 CDN。

在微信开发者工具中运行测试时,界面会呈现如下状态:若用户尚未创建角色,系统会自动弹出角色创建弹窗,该弹窗中会显示「获取微信昵称」的授权按钮。

  3. 获取微信的昵称并显示在 UI 界面上

接下来,我们一起来看看如何获取用户授权的微信昵称,并将其显示在 UI 界面上!

3.1 计算「获取微信昵称」按钮的屏幕点击区域

场景中的「获取微信昵称」的按钮上,已经提前挂载了准备好的脚本 GetWechatUserInfoButton.cs 。

GetWechatUserInfoButton.cs 脚本中代码如下:

  • 封装的 GetScreenPosition 方法,用于计算当前脚本挂载的按钮在屏幕上包围的矩形区域,并返回一个 Rect,可用于在屏幕上绘制“获取用户微信昵称”的点击区域。

using System.Collections;using System.Collections.Generic;using UnityEngine;
namespace Unity.UOS.TwentyFour.Wechat{    public class GetWechatUserInfoButton : MonoBehaviour    {        public Rect GetScreenPosition()        {            var rectTransform = gameObject.GetComponent<RectTransform>();            // 获取 RectTransform 的四个角的世界坐标            Vector3[] worldCorners = new Vector3[4];            rectTransform.GetWorldCorners(worldCorners);            // 创建屏幕矩形            var screenRect = new Rect(                worldCorners[0].x,                worldCorners[0].y,                worldCorners[2].x - worldCorners[0].x,                worldCorners[2].y - worldCorners[0].y);            Debug.Log($"Screen Rect: {screenRect}");            return screenRect;        }    }}

分析代码的思路:

  • 获取 RectTransform 组件:首先获取按钮上的 RectTransform 组件,用于访问 UI 元素的布局信息。

  • 获取四个角的世界坐标:通过 RectTransform.GetWorldCorners 方法,获取该 UI 元素(“获取微信昵称”按钮)的四个角在世界空间中的坐标,并存储到 worldCorners 数组。四个角点的坐标固定顺序为:0 左下、1 左上、2 右上、3 右下。

  • 推导屏幕矩形:由于当前场景中 Canvas 的渲染模式设置的是 Screen Space-Overlay ,且无相机变化,所以世界坐标的(x,y)可以直接等价于屏幕坐标的(x,y),如果是其它的渲染模式,则需要由世界坐标到屏幕坐标的转换。所以,在这里,将计算出的按钮的屏幕矩形区域存储在变量 screenRect 中。

3.2 获取授权的微信昵称

在 Wechat 脚本文件夹中,已准备好用于获取微信授权昵称的脚本 GetWechatUserInfo.cs,其封装好的功能可直接调用。

GetWechatUserInfo.cs 脚本的作用是:

  • 在微信小游戏环境中获取用户微信信息(UserInfo,包含昵称等)。若用户已授权直接获取;如果未授权,则在 UI 按钮的位置上,创建一个微信原生的授权按钮,引导用户「点击授权」,随后获取昵称信息。

using System.Collections;using System.Collections.Generic;using UnityEngine;using System.Threading.Tasks;#if (UNITY_WEIXINMINIGAME || MINIGAME_SUBPLATFORM_WEIXIN) && !UNITY_EDITORusing WeChatWASM;#endifusing System;
namespace Unity.UOS.TwentyFour.Wechat{    /// <summary>    /// 获取微信用户信息    /// </summary>    public class GetWechatUserInfo    {#if (UNITY_WEIXINMINIGAME || MINIGAME_SUBPLATFORM_WEIXIN) && !UNITY_EDITOR        private static WXUserInfoButton userInfoButton;        /// <summary>        /// 获取微信 userinfo        /// </summary>        public static Task<UserInfo> Get(GameObject getWechatUserInfoButton,             Action showWechatButtonCallback = null,            Action<UserInfo> OnGetNewUserInfo = null)        {            var tcs = new TaskCompletionSource<UserInfo>();            WX.GetSetting(new GetSettingOption()            {                fail = (err) =>                {                    Debug.Log("get setting fail");                    Debug.Log(err.errMsg);                    tcs.SetResult(null);                },                success = (res) =>                {                    if (res.authSetting.TryGetValue("scope.userInfo"out var hasUserInfo))                    {                        if (hasUserInfo)                        {                            // 已授权                            WX.GetUserInfo(new GetUserInfoOption()                            {                                success = userInfoRes =>                                {                                    Debug.Log("get user info success. nickname:");                                    Debug.Log(userInfoRes.userInfo.nickName);                                    tcs.SetResult(userInfoRes.userInfo);                                },                                fail = err =>                                {                                    tcs.SetResult(null);                                }                            });                        }                    }                    // 未授权                    if (!hasUserInfo)                    {                        if (showWechatButtonCallback != null)                        {                            showWechatButtonCallback.Invoke();                        }                        var wechatButton = getWechatUserInfoButton.GetComponent<GetWechatUserInfoButton>();                        var rect = wechatButton.GetScreenPosition();                        // 绘制全屏区域按钮                        userInfoButton = WX.CreateUserInfoButton((int)rect.x, Screen.height - (int)rect.y -  (int)rect.height, (int)rect.width, (int)rect.height, ""true);
                        userInfoButton.OnTap((tapRes) =>                        {                            Debug.Log("press button");                            // button.Hide();                            WX.GetUserInfo(new GetUserInfoOption()                            {                                success = userInfoRes =>                                {                                    // 用户授权                                    Debug.Log("get user info success. nickname:");                                    Debug.Log(userInfoRes.userInfo.nickName);                                    tcs.SetResult(userInfoRes.userInfo);                                    if (OnGetNewUserInfo != null)                                    {                                        OnGetNewUserInfo.Invoke(userInfoRes.userInfo);                                    }                                },                                fail = (err) =>                                {                                    // 用户未授权                                    Debug.Log("get user info fail");                                    Debug.Log(err.errMsg);                                    tcs.SetResult(null);                                }                            });                        });                    }                },            });            return tcs.Task;        }        public static void Hide()        {            if(userInfoButton != null)                userInfoButton.Hide();        }#endif    }}

 在 GetWechatUserInfo 脚本中:

  • 创建了变量 userInfoButton:缓存创建的微信原生授权按钮,便于后续隐藏该按钮。

  • 创建了方法 Get:用于获取微信昵称信息,方法中传入了三个参数:

    • getWechatUserInfoButton:Unity 场景中的「获取微信昵称」的按钮对象。

    • showWechatButtonCallback:可选回调;当检测到用户未授权时,会在创建微信原生授权按钮之前调用一次。

    • OnGetNewUserInfo:可选回调;当用户点击微信原生授权按钮并成功获取到新的 UserInfo 时调用,用于把最新的用户信息回传给业务层(如刷新 UI、缓存保存等)。已授权的直接获取流程不会触发该回调。

获取微信昵称的实现流程:

  • 调用 WX.GetSetting 方法,用于获取用户对各项权限的授权结果,检查是否已授权。会返回授权的字典 authSetting:在这里,键为权限名(如 scope.userInfo),值为 true/false 表示是否已授权。

  • 如果 hasUserInfo 为 true,说明已授权:

    • 直接调用 WX.GetUserInfo 方法,来获取用户信息。

  • 如果 hasUserInfo 为 false,说明未授权:

    • 可选回调:若提供 showWechatButtonCallback,此处先调用它(如显示提示或做 UI 动画)。

    • 计算按钮区域:找到方法传入的「获取微信昵称」按钮对象上的 GetWechatUserInfoButton.cs 脚本组件,调用封装好的 GetScreenPosition() 方法,获取该按钮在屏幕上的矩形区域 rect。

    • 创建微信原生授权按钮:调用 WX.CreateUserInfoButton() 方法,来创建微信原生授权按钮,位置与 Unity 场景中的按钮对齐,精确覆盖 Unity 的可点击区域。在这里做了坐标的转换:y = Screen.height - rect.y - rect.height,将 Unity 左下为原点的坐标系,转换为:微信左上为原点的坐标系。

    • 按钮点击回调 OnTap:用户点击后调用 WX.GetUserInfo 方法请求微信用户信息。

3.3 实现将微信昵称同步显示

接下来我们实现将获取到的授权的微信昵称,同步显示在 UI 界面上。找到场景中的 LoadGameData 对象上的 LoadGameData.cs 脚本并打开:

在 LoadGameData .cs 脚本中,添加代码:

  • 定义变量 getWechatUserInfoButton,表示场景中的「获取微信昵称」的按钮。

  • 如果是在微信小游戏平台,并且还没有昵称的话,调用封装好的 RandomName.Get 方法来随机生成一个默认昵称,赋给 defaultName 变量。

  • 启动协程 LoadWechatNickName:来加载微信的昵称。

    • 先用 defaultName 来设置默认的昵称,保证界面有即时显示;

    • 然后调用 GetWechatUserInfo.cs 脚本中封装的 Get 方法来异步获取微信用户信息,等待任务完成后拿到结果,读取昵称信息(nickName)。当昵称不为空时,调用之前封装好的 SetUserName 方法将昵称更新到 UI 文本框上。

namespace TwentyFour.Scripts.Gameplay.HomePage{    public class LoadGameData : MonoBehaviour    {        public GameObject createPersonaDialog;        public Text coverPageHintText;        [SerializeFieldprivate GameObject getWechatUserInfoButton;        //......
        IEnumerator CheckPersona()        {            //......
            if (shouldUseExistingPersona)            {                Identity.CurrentPersona = getPersonaTask.Result;                yield return StartCoroutine(SelectPersonaAndInit());                Logger.Log($"当前角色为:{Identity.CurrentPersona.DisplayName}");            }             else            {                Logger.Log("当前域无角色,请创建新角色");                var createPersonaController = createPersonaDialog.GetComponent<CreatePersona>();                createPersonaController.OnCreatePersonaComplete = OnCreatePersonaComplete;                createPersonaDialog.SetActive(true);
#if (UNITY_WEIXINMINIGAME || MINIGAME_SUBPLATFORM_WEIXIN) && !UNITY_EDITOR                // 微信平台,且还没有 display name                var defaultName = RandomName.Get(persona?.UserID);                yield return StartCoroutine(LoadWechatNickname(createPersonaController, defaultName));#endif            }        }
        // 微信昵称加载#if (UNITY_WEIXINMINIGAME || MINIGAME_SUBPLATFORM_WEIXIN) && !UNITY_EDITOR        private IEnumerator LoadWechatNickname(CreatePersona controller, string fallbackName)         {            controller.SetUserName(fallbackName);
            var wechatUserinfoTask = GetWechatUserInfo.Get(getWechatUserInfoButton);            yield return new WaitUntil(() => wechatUserinfoTask.IsCompleted);
            if (!wechatUserinfoTask.IsFaulted && wechatUserinfoTask.Result != null) {                var nickName = wechatUserinfoTask.Result.nickName;                if (!string.IsNullOrEmpty(nickName)) {                    controller.SetUserName(nickName);                }            }        }#endif
        //......          }}

在 Inspector 面板上,为 LoadGameData.cs 脚本中的 getWechatUserInfoButton 变量赋值:

3.4 更新角色信息

之前章节的教程中,我们可以看到创建角色的面板(CreatePersonaDialog)上的「确定」按钮(Button_Ok),已经绑定了 CreatePersona.cs 脚本中的 Create 方法。

使用微信账户登录时,系统会自动创建角色,无需手动创建。因此,在点击「确定」按钮执行的 Create 方法中,直接调用 PassportSDK 提供的 UpdatePersona 方法,更新用户在微信小游戏平台中的角色昵称信息即可。

namespace TwentyFour.Scripts.Features.Player{    public class CreatePersona : MonoBehaviour    {        //......
        public async void Create()        {#if (UNITY_WEIXINMINIGAME || MINIGAME_SUBPLATFORM_WEIXIN) && !UNITY_EDITOR            // 更新 passport 中角色信息            var updatedPersona  = await PassportSDK.Identity.UpdatePersona(personaNameText.text, ""new Dictionary<stringstring>            {                // { "uuid", externalLoginResponse.openid }            });            OnCreatePersonaComplete(updatedPersona);            return;     #endif            if (string.IsNullOrEmpty(personaNameText.text))            {                Debug.LogError("Empty Persona name");            }
            //......        }      }}

3.5 创建角色完成以后,隐藏微信按钮

当微信用户完成角色创建后,此前根据屏幕区域绘制的「获取微信昵称」按钮区域仍会持续存在。因此,我们可在角色创建完成的回调方法中,调用 GetWechatUserInfo.cs 脚本中已封装好的 Hide 方法来隐藏该按钮。

namespace TwentyFour.Scripts.Gameplay.HomePage{    public class LoadGameData : MonoBehaviour    {        //......
        void OnCreatePersonaComplete(Persona p)        {            Identity.CurrentPersona = p;            Logger.LogInfo($"创建角色成功,角色ID:{Identity.CurrentPersona.PersonaID}");            StartCoroutine(SelectPersonaAndInit());#if (UNITY_WEIXINMINIGAME || MINIGAME_SUBPLATFORM_WEIXIN) && !UNITY_EDITOR            GetWechatUserInfo.Hide();#endif        }        //......          }}

3.6 在微信开发者工具中再次测试

最后,大家可以自行再次重新打包小游戏项目工程,并将资源再次上传到 CDN 后,使用微信开发者工具再次运行项目。

可以看到创建角色的弹窗中,随机生成了角色昵称(如图中的:神秘人3008):

点击「获取微信昵称」的按钮,会弹出窗口来询问是否同意获取微信昵称的授权的。

可以点击「允许」获取你的微信信息。

在昵称输入框中会自动刷新显示你的昵称。

在玩家信息面板上,可以看到同步更新的角色微信昵称。

查看 Passport 的「角色管理」页面,可以看到角色名称也更新为你的昵称信息了。

下节教程预告



教程主题——《火拼24》系列教程六:1v1对战模式开发——联机架构选型分析

现在,《火拼24》的单人游戏联网功能已经讲完啦!

接下来,我们将正式进入「1v1对战模式开发」的核心章节。作为该章节的关键内容,在教程的第六节中,我们会重点展开对 UOS 多人联机架构的选型分析,为后续联机功能的实现奠定技术基础。

记得锁定更新,别错过每一步关键指南!下一篇教程见哦!



Unity Online Services (UOS) 是一个专为游戏开发者设计的一站式游戏云服务平台,提供覆盖游戏全生命周期的开发、运营和推广支持。

了解更多 UOS 相关信息:
官网:https://uos.unity.cn
技术交流 QQ 群:823878269




每一个“点赞”、“在看”,都是我们前进的动力 

图片


点击“阅读原文”,进入 Git 仓库下载项目工程!


图片

【声明】内容源于网络
0
0
UOS游戏云服务
Unity官方一站式游戏云服务
内容 56
粉丝 0
UOS游戏云服务 Unity官方一站式游戏云服务
总阅读107
粉丝0
内容56