Azure PlayFab 上的 Unity 第 2 部分:用户注册和登录





5.00/5 (2投票s)
本文档将从 Unity 开发者的角度介绍 Azure PlayFab。
在本文中,我们将学习如何在 Unity 中使用 PlayFab 的用户身份验证功能以及用户界面 (UI) 元素。我们将在此系列文章的第一部分中构建的 Unity游戏项目的基础上,添加用户使用 PlayFab 创建新游戏账户或登录现有账户的功能。
让我们以前面的系列文章中的 Unity 游戏项目为例,并添加使用 PlayFab 进行用户登录和账户创建的功能。
要求
要学习本教程,您需要一个PlayFab 账户以及以下软件。
- Unity 游戏引擎
- Microsoft Visual Studio
- 来自上一篇文章的 Unity游戏项目
任务简报
用户账户和登录为玩家在在线游戏中提供了独特的身份,并且是构建丰富多人游戏体验的第一步。PlayFab 使这一切成为可能,而无需我们自己部署或维护任何服务器或数据库。在本文中,我们将把账户注册和登录作为用户流程的一部分,让玩家能够识别他们在多人游戏服务上的身份。
使用登录 UI 元素更新初始场景
我们将首先在 IntroMenu 场景中放置所需的 UI 元素,以便玩家登录或创建账户。
如果您正在使用 FPS Microgame 进行学习,请展开项目文件到 FPS > Scenes,然后双击 IntroMenu 场景文件将其加载到编辑器中。
点击 Game 选项卡,使菜单场景获得正确的焦点。
我们将向画布添加三个输入字段,供玩家输入:用户名、电子邮件地址和密码。PlayFab 不需要电子邮件地址和用户名,但此字段将允许我们在未来为玩家提供密码重置选项。
我们右键点击 Canvas,然后选择 UI > Input Field,在菜单屏幕中央放置一个输入元素。将该元素命名或重命名为“UsernameField”,以便于查找。
我们重复这些步骤,直到我们在 Hierarchy 中拥有所有三个字段。
接下来,我们调整字段的位置,使它们不重叠或相互遮挡。我们点击 Username Input 字段,将 Pos Y 值设置为 60,选择 Email input 字段,并将其 Pos Y 值设置为 30,这样我们就将三个输入字段堆叠在一起。
然后,我们展开每个输入字段并选择 Placeholder,编辑每个字段的占位符文本以匹配字段。
接下来,我们选择每个输入字段,并将 Content Type 更改为匹配其所需输入类型的类型。Username 字段应设置为 Alphanumeric,Email 字段应设置为 Email Address,Password 字段应设置为 Password。这确保了输入字段具有正确的验证,并且在玩家键入时密码文本不会显示在屏幕上。
在继续之前,让我们保存我们的进度!
现在,我们通过右键点击 Canvas 并选择 UI > Button 来添加两个按钮,创建一个新按钮。为每个按钮指定一个描述性名称,例如“RegisterButton”和“LoginButton”。
我们希望调整按钮的大小和位置,使它们显示在输入字段下方。
以下是截图中使用的值:
- RegisterButton
- Pos X: -40
- Pos Y: -30
- Width: 80
- LoginButton
- Pos X: 40
- Pos Y: -30
- Width: 80
我们展开按钮元素并更新每个按钮的文本,以便用户知道要按哪个按钮。
我们还需要一个文本元素来显示账户创建和登录过程中可能产生的任何错误消息。因此,我们通过右键点击 Canvas 并选择 UI > Text 向画布添加一个文本元素,并将该元素命名为“ErrorMessage”。
我们将它放置在按钮下方,Pos Y 设置为 60,并将文本更新为“Error Message”以便更清晰。
我们使用 Paragraph > Alignment 按钮来居中文本,并将文本更改为红色,以提高可见性。
此外,我们将 Vertical Overflow 属性设置为 Overflow,这样长错误消息也会显示在按钮之前。
最后,让我们隐藏场景底部的“大”Play 按钮,以便玩家必须注册或登录才能玩游戏。
我们选择 StartButton 元素,并清除元素名称左侧的框以禁用它。
将代码添加到 UI
现在我们可以将一些代码附加到这些 UI 元素上,使它们能够运行。
我们在 Assets 文件夹中创建一个名为 Scripts 的新文件夹,这与 FPS 文件夹中已有的文件夹不同。
我们右键点击新的 Scripts 文件夹,然后点击 Create > C# Script 添加一个新的脚本文件。我们称之为“PlayFabCode”。
现在,我们双击脚本文件,在 Visual Studio 中将其打开,在那里我们可以编辑 C# 代码。
此文件包含 Start
和 Update
方法的占位符。
在顶部,我们添加以下 using
语句:
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using PlayFab;
using PlayFab.ClientModels;
在 PlayFabCode
类中,我们定义了这些映射到 UI 元素的变量:
public InputField Username, Email, Password;
public Text ErrorMessage;
public string SceneName = "";
我们在游戏开始时通过修改 Start
方法来清除 ErrorMessage
文本:
void Start()
{
ErrorText.text = "";
}
现在我们可以添加一些方法来调用 PlayFab 的账户注册 API,使用以下代码:
public void RegisterClick()
{
var register = new RegisterPlayFabUserRequest { Username = Username.text, Email = Email.text, Password = Password.text };
PlayFabClientAPI.RegisterPlayFabUser(register, OnRegisterSuccess, OnRegisterFailure);
}
private void OnRegisterSuccess(RegisterPlayFabUserResult result)
{
ErrorMessage.text = "";
SceneManager.LoadScene(SceneName); // Load Main Scene
}
private void OnRegisterFailure(PlayFabError error)
{
if (error.ErrorDetails != null && error.ErrorDetails.Count > 0)
{
using (var iter = error.ErrorDetails.Keys.GetEnumerator())
{
iter.MoveNext();
string key = iter.Current;
ErrorMessage.text = error.ErrorDetails[key][0];
}
}
else
{
ErrorMessage.text = error.ErrorMessage;
}
}
我们可以复制并修改这些方法,得到以下代码,以处理使用 PlayFab 进行登录:
public void LoginClick()
{
var login = new LoginWithPlayFabRequest { Username = Username.text, Password = Password.text };
PlayFabClientAPI.LoginWithPlayFab(login, OnLoginSuccess, OnLoginFailure);
}
private void OnLoginSuccess(LoginResult result)
{
ErrorMessage.text = "";
SceneManager.LoadScene(SceneName); // Load Main Scene
}
private void OnLoginFailure(PlayFabError error)
{
if (error.ErrorDetails != null && error.ErrorDetails.Count > 0)
{
using (var iter = error.ErrorDetails.Keys.GetEnumerator())
{
iter.MoveNext();
string key = iter.Current;
ErrorMessage.text = error.ErrorDetails[key][0];
}
}
else
{
ErrorMessage.text = error.ErrorMessage;
}
}
由于 PlayFab 会加密和哈希密码,所以我们不必担心安全性。
完整的脚本应如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using PlayFab;
using PlayFab.ClientModels;
public class PlayFabCode : MonoBehaviour
{
public InputField Username, Email, Password;
public Text ErrorMessage;
public string SceneName = "";
public void RegisterClick()
{
var register = new RegisterPlayFabUserRequest { Username = Username.text, Email = Email.text, Password = Password.text };
PlayFabClientAPI.RegisterPlayFabUser(register, OnRegisterSuccess, OnRegisterFailure);
}
private void OnRegisterSuccess(RegisterPlayFabUserResult result)
{
ErrorMessage.text = "";
SceneManager.LoadScene(SceneName); // Load Main Scene
}
private void OnRegisterFailure(PlayFabError error)
{
if (error.ErrorDetails != null && error.ErrorDetails.Count > 0)
{
using (var iter = error.ErrorDetails.Keys.GetEnumerator())
{
iter.MoveNext();
string key = iter.Current;
ErrorMessage.text = error.ErrorDetails[key][0];
}
}
else
{
ErrorMessage.text = error.ErrorMessage;
}
}
public void LoginClick()
{
var login = new LoginWithPlayFabRequest { Username = Username.text, Password = Password.text };
PlayFabClientAPI.LoginWithPlayFab(login, OnLoginSuccess, OnLoginFailure);
}
private void OnLoginSuccess(LoginResult result)
{
ErrorMessage.text = "";
SceneManager.LoadScene(SceneName); // Load Main Scene
}
private void OnLoginFailure(PlayFabError error)
{
if (error.ErrorDetails != null && error.ErrorDetails.Count > 0)
{
using (var iter = error.ErrorDetails.Keys.GetEnumerator())
{
iter.MoveNext();
string key = iter.Current;
ErrorMessage.text = error.ErrorDetails[key][0];
}
}
else
{
ErrorMessage.text = error.ErrorMessage;
}
}
// Start is called before the first frame update
void Start()
{
ErrorMessage.text = "";
}
// Update is called once per frame
void Update()
{
}
}
我们完成了该脚本的编辑。让我们关闭 Visual Studio,返回 Unity 编辑器。
将脚本事件链接到 UI
使这些 UI 元素功能化的第三个也是最后一个步骤是将它们链接到我们创建的脚本。
在 Unity 编辑器的 Hierarchy 中,我们在场景中创建一个空的 GameObject,以便将我们的 PlayFab UI 控件集中起来。方法是右键点击根 IntroMenu 场景,选择 GameObject > Create Empty,并将 GameObject 命名为“PlayFabControls”。
然后,我们将 PlayFabCode 脚本文件拖放到 PlayFabControls GameObject 上,以将其分配给该 GameObject。
现在,我们可以将每个 UI 元素(例如 UsernameField)拖放到右侧脚本的相应属性上。
我们还将 Scene Name 设置为“MainScene”,以便在成功注册或登录后切换到游戏场景。
最后,我们必须为两个按钮添加 On Click 事件处理程序。因此,我们选择 RegisterButton 元素并点击加号 (+) 按钮添加一个点击事件处理程序。
接下来,我们将 PlayFabControls 元素拖放到事件处理程序框(显示“None”的地方),然后将 Function 设置为 PlayFabCode > RegisterClick。
我们对 LoginButton 重复这些步骤,并选择 LoginClick 作为函数,这样它将激活登录脚本路径。
运行和测试
我们完成了!
我们保存项目并点击 Play 按钮来运行我们的游戏。如果一切设置正确,我们可以第一次注册一个账户,之后每次都使用相同的凭据登录。
后续步骤
使用 Azure PlayFab,我们通过一些 UI 和极少的代码,为我们的 Unity 游戏项目添加了功能齐全的用户身份验证功能。玩家可以创建带有唯一用户名的账户并登录,为所有其他 PlayFab 功能(例如排行榜上的分数报告)铺平了道路。
在下一篇文章中,我将开始创建游戏将连接到的后端代码,以实现多人游戏。欢迎加入!
要了解更多关于 Azure PlayFab 分析的信息,并获取功能概述、快速入门指南和教程,请查看Azure PlayFab 分析文档。