SDK 最低版本:2.0.0
本文将引导您完成以下场景,为您游戏中使用 Facebook 帐户的玩家设置身份验证:
注意:下方代码示例的前提为,您已经有玩家 Facebook 访问令牌。
- 设置 Facebook 帐户登录
- 回归用户登录或创建新用户。
- 将用户从匿名登录更新为通过 Facebook 帐户进行平台登录。
要在您的游戏中为玩家提供 Facebook 登录选项,请在 Facebook Developer Portal 中创建应用,并安装 Facebook Unity SDK,以登录用户帐户,获取访问令牌。
设置 Facebook 帐户登录
在以下步骤中,我们假设您已经设置好 Facebook 应用。
根据 Facebook 入门文档设置和安装 Facebook SDK。
将 Facebook 添加为 Unity Authentication 的 ID 提供商:
- 在 Unity 编辑器菜单中,访问 Edit(编辑)> Project Settings…(项目设置…),然后从导航菜单中选择 Services(服务)> Authentication(身份验证)。
- 将 **ID Providers(ID 提供商)**设置为 Facebook,然后单击 Add(添加)。
- 在 App ID(应用 ID)文本字段中输入应用 ID(在步骤 1 中获得)。
- 在 **App Secret(应用密钥)**文本字段中输入应用密钥,然后单击 Save(保存)。
使用此示例代码实现 Facebook 登录。
注意:Unity Authentication SDK 目前不支持快速登录令牌。
注意:根据此 Github 问题所述,Facebook SDK 在运行模式下无法与 Unity 2021.1 兼容。解决方法是,使用此拉取请求构建新的 Facebook.Unity.dll。
目前,我们支持“消费类”和“商业”应用类型。
参考的软件包并非由 Unity 开发、拥有或运营。请参考关于使用非 Unity 软件包的最佳实践。
using System.Collections.Generic;
using UnityEngine;
// Other needed dependencies
using Facebook.Unity;
public class FacebookExampleScript : MonoBehaviour
{
public string Token;
public string Error;
// Awake function from Unity's MonoBehaviour
void Awake()
{
if (!FB.IsInitialized)
{
// Initialize the Facebook SDK
FB.Init(InitCallback, OnHideUnity);
}
else
{
// Already initialized, signal an app activation App Event
FB.ActivateApp();
}
}
void InitCallback()
{
if (FB.IsInitialized)
{
// Signal an app activation App Event
FB.ActivateApp();
// Continue with Facebook SDK
}
else
{
Debug.Log("Failed to Initialize the Facebook SDK");
}
}
void OnHideUnity(bool isGameShown)
{
if (!isGameShown)
{
// Pause the game - we will need to hide
Time.timeScale = 0;
}
else
{
// Resume the game - we're getting focus again
Time.timeScale = 1;
}
}
public void Login()
{
// Define the permissions
var perms = new List<string>() { "public_profile", "email" };
FB.LogInWithReadPermissions(perms, result =>
{
if (FB.IsLoggedIn)
{
Token = AccessToken.CurrentAccessToken.TokenString;
Debug.Log($"Facebook Login token: {Token}");
}
else
{
Error = "User cancelled login";
Debug.Log("[Facebook Login] User cancelled login");
}
});
}
}
回归玩家登录或创建新玩家
您可以使用 SignInWithFacebookAsync
方法执行以下操作之一:
- 通过 Facebook 凭据创建新的 Unity Authentication 玩家帐户。
- 通过 Facebook 凭据登录现有玩家帐户。
如果您的项目中没有与凭据关联的 Unity Authentication 玩家帐户,SignInWithFacebookAsync
将创建新的玩家帐户。如果您的项目中具有与凭据关联的 Unity Authentication 玩家帐户,SignInWithFacebookAsync
将登录该玩家帐户。该功能不考虑缓存的玩家帐户,SignInWithFacebookAsync
会替换缓存的玩家帐户。
async Task SignInWithFacebookAsync(string accessToken)
{
try
{
await AuthenticationService.Instance.SignInWithFacebookAsync(accessToken);
Debug.Log("SignIn is successful.");
}
catch (AuthenticationException ex)
{
// Compare error code to AuthenticationErrorCodes
// Notify the player with the proper error message
Debug.LogException(ex);
}
catch (RequestFailedException ex)
{
// Compare error code to CommonErrorCodes
// Notify the player with the proper error message
Debug.LogException(ex);
}
}
将玩家帐户从匿名更新为 Facebook 帐户
在您设置完匿名身份验证后,如果玩家想从匿名升级为 Facebook 帐户,并通过 Facebook 登录,您应在游戏中引导玩家触发 Facebook 登录并从 Facebook 获取访问令牌。然后,调用 LinkWithFacebookAsync
API,将玩家帐户与 Facebook 访问令牌关联。
如果 SDK 上有缓存的玩家帐户,您可以将缓存的玩家帐户与 Facebook 帐户关联。
- 通过
SignInAnonymouslyAsync
登录缓存玩家的帐户。 - 通过
LinkWithFacebookAsync
将缓存的玩家帐户与 Facebook 帐户关联。
要详细了解缓存的玩家帐户,请阅读缓存玩家登录部分。
async Task LinkWithFacebookAsync(string accessToken)
{
try
{
await AuthenticationService.Instance.LinkWithFacebookAsync(accessToken);
Debug.Log("Link is successful.");
}
catch (AuthenticationException ex) when (ex.ErrorCode == AuthenticationErrorCodes.AccountAlreadyLinked)
{
// Prompt the player with an error message.
Debug.LogError("This user is already linked with another account. Log in instead.");
}
catch (AuthenticationException ex)
{
// Compare error code to AuthenticationErrorCodes
// Notify the player with the proper error message
Debug.LogException(ex);
}
catch (RequestFailedException ex)
{
// Compare error code to CommonErrorCodes
// Notify the player with the proper error message
Debug.LogException(ex);
}
}
如果玩家通过登录或创建新玩家配置文件而触发 Facebook 登录,并且您已收到 Facebook 访问令牌,调用以下 API 来对玩家进行身份验证。
async Task SignInWithFacebookAsync(string accessToken)
{
try
{
await AuthenticationService.Instance.SignInWithFacebookAsync(accessToken);
Debug.Log("SignIn is successful.");
}
catch (AuthenticationException ex)
{
// Compare error code to AuthenticationErrorCodes
// Notify the player with the proper error message
Debug.LogException(ex);
}
catch (RequestFailedException ex)
{
// Compare error code to CommonErrorCodes
// Notify the player with the proper error message
Debug.LogException(ex);
}
}
实现 Facebook 登录身份验证
如果玩家通过登录或创建新玩家帐户而触发 Facebook 登录,并且您已收到 Facebook 访问令牌,调用以下 API 来实现玩家登录:SignInWithFacebookAsync(string accessToken)
取消 Facebook 帐户关联
使用 UnlinkFacebookAsync
API 可以取消玩家帐户与其 Facebook 帐户的关联。一旦取消关联,如果玩家帐户不再关联到任何其他身份,则会转换为匿名帐户。
async Task UnlinkFacebookAsync(string idToken)
{
try
{
await AuthenticationService.Instance.UnlinkFacebookAsync(idToken);
Debug.Log("Unlink is successful.");
}
catch (AuthenticationException ex)
{
// Compare error code to AuthenticationErrorCodes
// Notify the player with the proper error message
Debug.LogException(ex);
}
catch (RequestFailedException ex)
{
// Compare error code to CommonErrorCodes
// Notify the player with the proper error message
Debug.LogException(ex);
}
}