做者:崔毅然html
在这篇文章中,咱们使用 LeanCloud 做为后端来实现游戏内的帐户系统。这篇文章以 Unity 游戏引擎中的 C# 语言为示例,主要讲解如何实现几种主流的登陆方式,包括游客登陆、游客帐号升级、手机号验证码登陆、用户名密码注册及登陆。后端
首先要接入 LeanCloud 的 SDK,接入方式能够参考文档。bash
为了让玩家尽快体验游戏,每个游戏都会有游客登陆的功能。游客登陆在 LeanCloud 中能够这样来实现:微信
var user = await AVUser.LogInAnonymouslyAsync();
复制代码
调用上述代码成功后,LeanCloud 会自动生成一个游客用户登陆,进入「控制台」 - 「存储」-「_User」表就能够看到表中新增了一条数据。在客户端登陆的游客信息会一直被 SDK 存在本地,直到玩家删除游戏或主动退出登陆。但就像全部游戏中的游客登陆同样,当该游客退出登陆后会丢失本身所有的游戏数据,为了保存游戏数据,须要将游客帐号升级为正式帐号。app
为了避免丢失玩家的数据,咱们会在游戏内建议玩家升级帐号为正式玩家。例如绑定微信登陆、绑定用户名密码及手机号,绑定成功后玩家就能以正式的登陆方式获取到本身的游戏数据。ui
假设咱们已经经过某些方法(例如使用 ShareSDK)拿到了微信的 openId、access_token、unionId 等,能够这样在 LeanCloud 中将游客帐号关联到微信登陆中:spa
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);
复制代码
关联成功后,玩家之后就能够用微信登陆了,登陆代码见下文的第三方帐户登陆。code
var currentUser = AVUser.CurrentUser;
currentUser.Username = "username";
currentUser.Password = "password";
user.MobilePhoneNumber = "186xxxxxxxx";
await currentUser.SaveAsync();
复制代码
若是保存了手机号,保存成功后 LeanCloud 会自动向该手机号发送一条验证码,用户输入验证码后验证手机号:orm
await AVUser.VerifyMobilePhoneAsync("6位数字验证码");
复制代码
手机号码验证成功后,该玩家之后就能以手机号登陆了,这样就保证了游戏数据不会丢失。cdn
手机号+验证码登陆、用户名及密码登陆的代码见下文。
这种登陆方式下,若是 _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 登陆也完成了。