使用 Unity 在 Azure PlayFab 上进行多人游戏(第二部分):用户注册和登录





5.00/5 (3投票s)
如何通过 PlayFab 的用户账户创建和身份验证 API 添加玩家创建账户和登录游戏的功能。
虽然构建多人游戏对于独立开发者来说可能看起来令人生畏,而工作室也深知管理多人功能通常需要多少工作量,但 PlayFab 可以轻松地为您的 Unity 游戏添加有用的功能。在本系列文章的第一篇文章中,我们基于模板创建了一个新的 Unity 游戏,并将其连接到我们的 PlayFab 账户。
在本文中,我们将使用 Unity 中的用户界面 (UI) 元素来添加 PlayFab 的用户身份验证功能。我们将在此基础上构建我们的 Unity 游戏项目,使用户能够通过 PlayFab 创建新玩家账户或使用现有账户登录。
要求
要遵循本指南,您需要一个免费的PlayFab 账户。您还需要在计算机上安装以下软件:
- Unity 游戏引擎(可免费下载和使用)
- Microsoft Visual Studio(可免费下载和使用)
您还需要我们在上一篇文章中创建的 Unity 游戏项目。您应该先遵循该指南,然后再继续本文。请记住,您可以查看完整的项目代码来查看游戏实际运行效果。
使用登录 UI 元素更新介绍场景
我们将首先在介绍菜单场景中放置必要的 UI 元素,供玩家登录或创建账户。
展开项目文件到 **FPS > Scenes**,如果您正在通过 FPS Microgame 进行操作,请双击 **IntroMenu** 场景文件将其加载到编辑器中。
然后,点击 **Game** 选项卡,并将菜单场景 properly 聚焦。
我们将向 **Canvas** 添加三个 **Input Fields**,供玩家输入用户名、电子邮件地址和密码。PlayFab 不需要电子邮件地址和用户名,但第二个字段允许我们添加一个选项,以便将来玩家可以重置密码。
右键单击 **Canvas** 并选择 **UI > Input Field**,在菜单屏幕中心放置一个输入元素。将该元素命名或重命名为“**UsernameField**”,以便于查找。
重复这些步骤,直到层级结构中出现所有三个字段。
接下来,我们调整字段位置以避免重叠和隐藏。点击 **Username** 输入字段,并将 **Pos Y** 值设置为 60,然后选择 **Email** 输入字段并将其 **Pos Y** 值设置为 30,将这三个输入字段堆叠在一起。
然后,展开每个输入字段并选择 **Placeholder**,以便编辑每个字段的占位符文本以匹配其功能(Username、Email Address 和 Password)。
接下来,选择每个输入字段并将 **Content Type** 更改为匹配其所需输入类型。具体来说,将 **Username** 字段设置为 Alphanumeric,将 **Email** 字段设置为 Email Address,将 **Password** 字段设置为 Password。这些设置确保输入字段具有正确的验证,并且在玩家输入时密码文本会在屏幕上隐藏。
快速提醒一下:别忘了保存您的进度!
接下来,我们添加两个按钮。
右键单击 Canvas 并选择 **UI > Button**,在 Canvas 上创建一个新按钮。为每个按钮指定一个描述性名称,例如“**RegisterButton**”和“**LoginButton**”。
我们将调整按钮的大小和位置,使其显示在输入字段下方。
我们使用这些值
RegisterButton
- Pos X: -40
- Pos Y: -30
- Width: 80
LoginButton
- Pos X: 40
- Pos Y: -30
- Width: 80
展开按钮元素并更新它们的文本,以便用户知道要按哪个按钮。
我们还需要一个文本元素来显示账户创建或登录过程中可能产生的任何错误消息。因此,通过右键单击并选择 **UI > Text** 向 Canvas 添加一个文本元素。将该元素命名为“**ErrorMessage**”。
将文本元素定位在按钮下方,**Pos Y** 为 -60。此外,为了清晰起见,将文本更新为“**Error Message**”。
使用 **Paragraph > Alignment** 按钮居中文本对齐,并将文本颜色更改为红色以提高可见性。
此外,我们将 **Vertical Overflow** 属性设置为 Overflow,以便长错误消息也能在按钮之前显示。
最后,让我们隐藏场景底部的“**Play**”大按钮。这样,玩家必须先注册或登录才能玩游戏。
因此,选择 **StartButton** 元素,然后取消选中该元素名称左侧的框以将其禁用。
为 UI 添加代码
现在,我们可以为这些 UI 元素附加一些代码,使它们能够执行操作。
首先,在 *Assets* 文件夹中创建一个名为“Scripts”的新文件夹。请注意,这与 *FPS* 文件夹中已有的文件夹不同。
右键单击新的 *Scripts* 文件夹。然后,单击 **Create > C# Script** 来添加一个新的脚本文件。我们将其命名为“PlayFabCode”。
双击 **Script** 文件,在 Visual Studio 中打开它,以便我们可以编辑 C# 代码。
该文件将包含 `Start()` 和 `Update()` 的占位符方法。
在 **Script** 文件的顶部,添加以下 `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;
}
}
关于密码加密的说明:如果您担心使用这些 API 时密码的安全性,您可以放心,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 编辑器层级结构中,为场景创建一个 **Empty** 对象。通过右键单击根 **IntroMenu** 场景并选择 **GameObject > Create Empty**,我们可以将我们的 PlayFab UI 控件集中在那里。将该对象命名为“**PlayFabControls**”。
然后,我们将 *PlayFabCode* 脚本文件拖放到 **PlayFabControls** 游戏对象上以分配脚本。
现在,我们可以将每个 UI 元素(例如 **UsernameField**)拖放到脚本右侧相应的属性上。
此外,我们将 **Scene Name** 设置为“**MainScene**”,以便在成功注册或登录后切换场景时导航到游戏 Unity 场景。
最后,我们需要为两个按钮添加 `onClick` 事件处理程序。首先,选择 **RegisterButton** 元素,然后单击 **+** 按钮添加一个 `onClick` 事件处理程序。
现在,将 **PlayFabControls** 元素拖放到事件处理程序框(显示 **None** 的地方)。然后,将 **Function** 设置为 **PlayFabCode > RegisterClick()**。
对 **LoginButton** 重复这些步骤,并为函数选择 **LoginClick()**,以便激活登录脚本路径。
就是这样!您的登录屏幕现已完成。**保存**项目。
运行和测试
现在,您可以单击 **Play** 按钮来运行您的游戏。如果您设置一切正确,第一次将能够注册一个账户,之后每次都可以使用相同的凭据登录。
后续步骤
我们使用 Azure PlayFab 为我们的 Unity 游戏项目添加了功能齐全的用户身份验证,只需少量 UI 和极少的代码。玩家现在可以创建带有唯一用户名的账户,然后登录,为排行榜分数报告等其他 PlayFab 功能铺平道路。
加入我们,在下一篇文章中开始创建后端代码。我们的游戏将连接到此后端,以实现多人游戏。
要了解有关新的 PlayFab 匹配功能(Matchmaking)的更多信息,请参阅 Matchmaking - PlayFab。