You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何像Minecraft基岩版那样获取玩家Microsoft用户名

Unity 对接微软账号获取登录用户名实现方案

要实现类似Minecraft基岩版拉取微软账号用户名作为游戏内昵称的效果,直接走微软官方身份认证流程即可,步骤如下:

前置配置

  • 登录微软Azure后台,在Azure Active Directory中注册新的应用注册项,记录生成的Client ID
  • 给注册的应用添加User.Read委托权限,该权限用于读取登录用户的公开基础资料
  • 根据你发布的目标平台配置重定向地址:PC单机平台填http://localhost:8080即可,UWP、主机等平台按照微软官方对应平台的重定向规则填写
  • 下载适配Unity所用.NET版本的MSAL(Microsoft Authentication Library)库dll,放入项目Assets/Plugins目录下

注意:MSAL库版本要匹配Unity项目的.NET兼容等级,Unity 2021及以上版本推荐选择适配.NET Standard 2.1的库版本,否则会出现dll加载失败的报错

核心代码实现

核心逻辑是拉起浏览器让用户完成微软账号登录授权,拿到访问令牌后调用微软Graph接口拉取用户信息,示例代码如下:

using Microsoft.Identity.Client;
using System;
using System.Linq;
using System.Threading.Tasks;
using UnityEngine;

public class MicrosoftAuthManager : MonoBehaviour
{
    private static IPublicClientApplication _clientApp;
    // 替换为你前面拿到的Azure应用Client ID
    private static string _clientId = "你的Azure应用Client ID";
    // 读取用户基础资料所需的权限范围
    private static string[] _scopes = new[] { "User.Read" };

    private async void Start()
    {
        _clientApp = PublicClientApplicationBuilder.Create(_clientId)
            .WithRedirectUri("http://localhost:8080")
            .Build();

        string playerName = await LoginAndGetUserName();
        Debug.Log($"当前登录玩家用户名:{playerName}");
        // 此处将playerName赋值给游戏内玩家名显示组件即可
    }

    private async Task<string> LoginAndGetUserName()
    {
        AuthenticationResult authResult = null;
        // 优先查找本地缓存的登录凭证,存在就静默登录,不需要重复弹授权页
        var accounts = await _clientApp.GetAccountsAsync();
        try
        {
            authResult = await _clientApp.AcquireTokenSilent(_scopes, accounts.FirstOrDefault())
                .ExecuteAsync();
        }
        catch (MsalUiRequiredException)
        {
            // 缓存失效或者首次登录,弹出系统浏览器走账号密码授权流程
            authResult = await _clientApp.AcquireTokenInteractive(_scopes)
                .ExecuteAsync();
        }

        // 拿到有效令牌后调用Graph接口拉取用户公开资料
        var httpClient = new System.Net.Http.HttpClient();
        httpClient.DefaultRequestHeaders.Authorization = 
            new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
        var response = await httpClient.GetAsync("https://graph.microsoft.com/v1.0/me");
        if (response.IsSuccessStatusCode)
        {
            var userData = JsonUtility.FromJson<MicrosoftUserData>(await response.Content.ReadAsStringAsync());
            // displayName就是用户微软账号对外显示的用户名
            return userData.displayName;
        }
        // 拉取失败时返回兜底默认名
        return "玩家" + UnityEngine.Random.Range(1000, 9999);
    }

    [Serializable]
    private class MicrosoftUserData
    {
        public string displayName;
    }
}

补充说明

  • 如果你要和Minecraft基岩版完全一致显示Xbox玩家代号(Gamertag)而不是微软账号本身的显示名,需要在拿到微软token后额外走Xbox Live服务的授权流程,再调用Xbox Profile接口拉取对应玩家代号即可
  • 登录凭证会自动存在本地,下次启动不需要重复让用户输入账号密码,直接走静默拉取token的流程即可
  • 不同发布平台需要对应配置权限:比如UWP平台需要在清单文件中开启网络、企业认证权限,WebGL平台需要配置对应平台的弹窗授权逻辑

显示用户名的Minecraft基岩版菜单界面

内容的提问来源于stack exchange,提问作者1WeirdDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:30:53