如何实现手游中的账户系统|游戏开发

avatar
技术支持 @LeanCloud

作者:崔毅然

在这篇文章中,我们使用 LeanCloud 作为后端来实现游戏内的账户系统。这篇文章以 Unity 游戏引擎中的 C# 语言为示例,主要讲解如何实现几种主流的登录方式,包括游客登录、游客账号升级、手机号验证码登录、用户名密码注册及登录。

接入 SDK

首先要接入 LeanCloud 的 SDK,接入方式可以参考文档

游客登录

为了让玩家尽快体验游戏,每一个游戏都会有游客登录的功能。游客登录在 LeanCloud 中可以这样来实现:

var user = await AVUser.LogInAnonymouslyAsync();

调用上述代码成功后,LeanCloud 会自动生成一个游客用户登录,进入「控制台」 - 「存储」-「_User」表就可以看到表中新增了一条数据。在客户端登录的游客信息会一直被 SDK 存在本地,直到玩家删除游戏或主动退出登录。但就像所有游戏中的游客登录一样,当该游客退出登录后会丢失自己全部的游戏数据,为了保存游戏数据,需要将游客账号升级为正式账号。

游客账号升级

为了不丢失玩家的数据,我们会在游戏内建议玩家升级账号为正式玩家。例如绑定微信登录、绑定用户名密码及手机号,绑定成功后玩家就能以正式的登录方式获取到自己的游戏数据。

升级为微信登录

假设我们已经通过某些方法(例如使用 ShareSDK)拿到了微信的 openId、access_token、unionId 等,可以这样在 LeanCloud 中将游客账号关联到微信登录中:

var authData = new Dictionary<string, object> {
    { "access_token", "ACCESS_TOKEN" },
    { "expires_in", 7200 },
    { "openid", "OPENID" },// openId 是用户在当前微信应用下的唯一 Id
};
 
// unionId 是用户在整个微信内的唯一 Id
var unionId = "ox7NLs06ZGfdxbLiI0e0F1po78qE";
 
AVUserAuthDataLogInOption options = new AVUserAuthDataLogInOption
{
    UnionIdPlatform = "weixin",// 这里指定用微信平台
    AsMainAccount = true
};
 
var user = AVUser.CurrentUser;
// 绑定微信登录,第二个参数 weixinapp1是自定义的当前微信应用的标识
await user.AssociateAuthDataAndUnionIdAsync(authData, "weixinapp1", unionId, options);

关联成功后,玩家以后就可以用微信登录了,登录代码见下文的第三方账户登录。

绑定用户名、密码及手机号
var currentUser = AVUser.CurrentUser;
currentUser.Username = "username";
currentUser.Password = "password";
user.MobilePhoneNumber = "186xxxxxxxx";
await currentUser.SaveAsync();

如果保存了手机号,保存成功后 LeanCloud 会自动向该手机号发送一条验证码,用户输入验证码后验证手机号:

await AVUser.VerifyMobilePhoneAsync("6位数字验证码");

手机号码验证成功后,该玩家以后就能以手机号登录了,这样就保证了游戏数据不会丢失。

手机号+验证码登录、用户名及密码登录的代码见下文。

手机号 + 验证码登录

这种登录方式下,如果 _User 表中没有这个手机号,则视为新用户,会自动注册账号并登录;如果 _User 表中某个用户已经有了这个手机号(例如曾使用过该手机号登录,或通过游客账号升级绑定的信息),则直接登录。

首先,调用发送登录验证码的接口:

await AVCloud.RequestSMSCodeAsync("18611111111");

然后使用验证码来登录

var user = await AVUser.SignUpOrLogInByMobilePhoneAsync("18611111111", "6位短信验证码");

用户名 + 密码注册登录

这种是最常见的登录方式,稍微有一点麻烦的是,需要玩家记住自己的用户名和密码。

注册

如果 _User 表中没有相应的用户名密码信息,例如从未注册过,也没有通过游客升级的方式增加用户名密码,需要先注册。

var user = new AVUser();
user.Username = "Tom";
user.Password = "cat!@#123";
await user.SignUpAsync();
Debug.Log(user.Username);
登录
var user = await AVUser.LogInAsync("username", "password");
Debug.Log(user.Username);

第三方登录

微信或 QQ 登录可以让玩家更便捷的登录游戏。利用 LeanCloud 第三方登录的模块就可以完成这种场景。

微信登录

假设现在开发者已经通过某些方法(例如使用 ShareSDK)拿到了微信的 openId、access_token、unionId 等,无需注册就可以在 LeanCloud 中直接登录。如果游客已经升级绑定了微信信息,也可以通过这种方式来登录。

var authData = new Dictionary<string, object> {
    { "access_token", "ACCESS_TOKEN" },
    { "expires_in", 7200 },
    { "openid", "OPENID" },// openId 是用户在当前微信应用下的唯一 Id
};

// unionId 是用户在整个微信内的唯一 Id 
var unionId = "ox7NLs06ZGfdxbLiI0e0F1po78qE";
 
AVUserAuthDataLogInOption options = new AVUserAuthDataLogInOption
{
    UnionIdPlatform = "weixin",// 这里指定用微信平台
    AsMainAccount = true
};
 
// 绑定微信登录,第二个参数 weixinapp1 是自定义的当前微信应用的标识
var user = await AVUser.LogInWithAuthDataAndUnionIdAsync(authData, "weixinapp1", unionId, options);

LogInWithAuthDataAndUnionIdAsync 这个方法中,第二个参数是自己定义的微信应用的名字,第三个参数 unionId 是用户在多个微信应用之间互通的唯一 id。如果我们有多个微信应用,就可以通过 unionId 登录来实现多个微信应用之间的账号互通。

其他平台

如果是其他平台,例如 facebook 是没有 unionId 的,这个时候只需要 access_token、expires_in、uid 三个自定义字段就可以了。

var authData = new Dictionary<string, object> {
    { "access_token", "ACCESS_TOKEN" },
    { "expires_in", 7200 },
    { "uid", "FACEBOOK_UID" },
};
var user = await AVUser.LogInWithAuthDataAsync(authData, "facebook");

由于 LeanCloud 默认只支持微信、QQ、新浪微博登录,因此对 Facebook 需要额外去设置一下唯一索引,设置唯一索引的方式非常简单,只需要进入控制台,在 _User 表中选择「其他」-「索引」,将 authData.facebook.uid 建立唯一索引,并且勾选上「允许缺失值」选项,这样 Facebook 登录也完成了。