> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Defold 的 Lua 快速入门

> 使用 PlayFab Defold 客户端 SDK 搭建 Defold 项目，并在 Lua 中发出第一次 PlayFab API 调用，用于跨平台游戏开发。

本快速入门将帮助你使用 Defold 发出第一次 PlayFab API 调用。

在调用任何 PlayFab API 之前，你必须拥有一个 [PlayFab 开发者帐户](https://developer.playfab.com)。

## Defold 项目设置

操作系统：本指南针对 Windows 10 编写。在 Mac 上也应能正常使用。

1. 在 [https://www.defold.com/](https://www.defold.com/) 创建帐户并下载 Defold，或登录（使用 Google O-Auth）：[https://d.defold.com/stable/](https://d.defold.com/stable/)。

2. 如果你还未完成 Defold “Getting Started Tutorial”，请先完成该教程。

3. 在 Defold Dashboard 上创建一个新项目，如下图所示。

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/lua/defold-add-project.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=cb5e329e814177d3456031004cccfe39" alt="创建新的 Defold 项目" width="162" height="376" data-path="images/playfab/sdks/lua/defold-add-project.png" />

4. 运行 **Defold** 并加载新项目。你应看到若干窗口，类似下面的示例。

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/lua/defold-dashboard.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=3451047b4d248b54063ae35d647b01f4" alt="Defold dashboard" width="1626" height="1360" data-path="images/playfab/sdks/lua/defold-dashboard.png" />

5. 更新项目设置，并将 PlayFab 加入依赖项：

   [https://github.com/PlayFab/LuaSdk/raw/master/Defold/PlayFabClientSdk.zip](https://github.com/PlayFab/LuaSdk/raw/master/Defold/PlayFabClientSdk.zip)

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/lua/defold-dependency-1.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=801a76d9fbd6fd3c4d1c2674a6cae4be" alt="将 PlayFab 添加到依赖项" width="865" height="294" data-path="images/playfab/sdks/lua/defold-dependency-1.png" />

6. 选择：**Project** -> **Fetch Libraries**，你应看到一个新的内置 PlayFab 文件夹，如下所示。

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/lua/defold-dependency-2.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=ce12f4685d293dc015acdf6132997d53" alt="Project fetch libraries" width="812" height="289" data-path="images/playfab/sdks/lua/defold-dependency-2.png" />

7. 创建几个文件：

   * **main/PfGettingStarted.gui**

   * 选择 "main" 文件夹 -> **new** -> **Gui File** -> **PfGettingStarted.gui**。

   * **main/PfGettingStarted.gui\_script**

   * 选择 "main" 文件夹 -> **new** -> **Gui Script File** -> **PfGettingStarted.gui\_script**。

8. 在 main.collection 中挂载新的 GUI。

   * 选择 main.collection 以打开它。

   * 在 Outline 面板中：
     * 选择 **Add Game Object**（可选，将其重命名为 **PfGui**）。
       * 选择新对象，**Add Component From File...**
         * PfGettingStarted.gui（如上创建）。

   * 查看 main.collection 时，Outline 面板应类似下面的示例。

     <img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/lua/defold-main-outline.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=cdc7b1fa9078bf5fcd4bb85877858a7a" alt="Main Outline 面板" width="259" height="110" data-path="images/playfab/sdks/lua/defold-main-outline.png" />

PlayFab 安装完成。此项目尚未准备好构建，但我们将在下一步进行修复。

## 设置第一次 API 调用

本指南将提供发出第一次 PlayFab API 调用的最少步骤。确认信息将显示在游戏窗口中。

1. 在 Defold 编辑器中，双击 **PfGettingStarted.gui\_script**。

2. 这将打开文件进行文本编辑。

3. 按下面所示更新 PfGettingStarted.gui\_script 的内容。

<Note>
  要查找此示例中 loginRequest 对象的正确格式，请参阅 [LoginWithCustomID](xref:titleid.playfabapi.com.client.authentication.loginwithcustomid) 的 API 参考。
</Note>

```gui_script theme={null}
local PlayFabClientApi = require("PlayFab.PlayFabClientApi")
local IPlayFabHttps = require("PlayFab.IPlayFabHttps")
local PlayFabHttps_Defold = require("PlayFab.PlayFabHttps_Defold")
IPlayFabHttps.SetHttp(PlayFabHttps_Defold) -- Assign the Defold-specific IHttps wrapper

PlayFabClientApi.settings.titleId = "144" -- Please change this value to your own titleId from PlayFab Game Manager

function init(self)
    local loginRequest = {
        -- See the API reference for LoginWithCustomID
        TitleId = PlayFabClientApi.settings.titleId,
        CustomId = "GettingStartedGuide",
        CreateAccount = true
    }
    PlayFabClientApi.LoginWithCustomID(loginRequest, OnLoginSuccess, OnLoginFailed)
end

function OnLoginSuccess(result)
    local pfTestOutput = gui.get_node("pfOutput")
    gui.set_text(pfTestOutput, "Congratulations, you made your first successful API call!")
end

function OnLoginFailed(error)
    local pfTestOutput = gui.get_node("pfOutput")
    local message = "Something went wrong with your first API call.\n"
    local message = message .. "Here's some debug information:\n"
    local message = message .. error.GenerateErrorReport()
    gui.set_text(pfTestOutput, message)
end
```

4. 在 **Defold** 编辑器中，右键单击 **PfGettingStarted.gui** -> **Open With** -> **Text Editor**。遗憾的是，这会改变 Defold 的一个内部设置，所以：

   * 再次打开它：右键单击 **PfGettingStarted.gui** -> **Open With** -> **GUI Editor**。这会将默认设置重置为正常状态。

   * 选择 **PfGettingStarted.gui** 的文本编辑选项卡。

   * 按下面所示更新 PfGettingStarted.gui 的文本内容。

```gui_script theme={null}
script: "/main/PfGettingStarted.gui_script"
fonts {
  name: "system_font"
  font: "/builtins/fonts/system_font.font"
}
background_color {
  x: 0.0
  y: 0.0
  z: 0.0
  w: 1.0
}
nodes {
  position {
    x: 100.0
    y: 620.0
    z: 0.0
    w: 1.0
  }
  rotation {
    x: 0.0
    y: 0.0
    z: 0.0
    w: 1.0
  }
  scale {
    x: 1.0
    y: 1.0
    z: 1.0
    w: 1.0
  }
  size {
    x: 1080.0
    y: 520.0
    z: 0.0
    w: 1.0
  }
  color {
    x: 1.0
    y: 1.0
    z: 1.0
    w: 1.0
  }
  type: TYPE_TEXT
  blend_mode: BLEND_MODE_ADD
  text: "Logging in..."
  font: "system_font"
  id: "pfOutput"
  xanchor: XANCHOR_LEFT
  yanchor: YANCHOR_TOP
  pivot: PIVOT_NW
  outline {
    x: 1.0
    y: 1.0
    z: 1.0
    w: 1.0
  }
  shadow {
    x: 1.0
    y: 1.0
    z: 1.0
    w: 1.0
  }
  adjust_mode: ADJUST_MODE_FIT
  line_break: false
  layer: ""
  inherit_alpha: true
  clipping_mode: CLIPPING_MODE_NONE
  clipping_visible: true
  clipping_inverted: false
  alpha: 1.0
  outline_alpha: 1.0
  shadow_alpha: 1.0
  template_node_child: false
  text_leading: 1.0
  text_tracking: 0.0
  size_mode: SIZE_MODE_AUTO
}
material: "/builtins/materials/gui.material"
adjust_reference: ADJUST_REFERENCE_PARENT
max_nodes: 512
```

## 完成并执行

首先，确保一切都已保存，并选择另一个选项卡。然后查找 " \* " 标记——有时 Defold 不会刷新。

然后，构建你的游戏（Ctrl+b 或下拉菜单：**Project** -> **Build and Launch**）。你应在屏幕上看到以下文本：

"Congratulations, you made your first successful API call!"

有关所有可用客户端 API 调用的列表，请参阅我们的 [PlayFab API 参考](/services/playfab/api-references) 文档。

祝你编码愉快！

## 代码解析

* `PfGettingStarted.gui`
  * 我们对 `PfGettingStarted.gui` 的说明只是为了简便，并非用于教学。此文件是一个 GUI 定义，它向屏幕添加一个文本框，并将其绑定到另一个脚本：`PfGettingStarted.gui_script`。通常你不会以文本形式编辑这些文件。
  * 如需构建 Defold GUI 小部件的正确说明，请阅读此指南：
  * [Defold 中的 GUI 场景](https://www.defold.com/manuals/gui/)

* `PfGettingStarted.gui_script`
  * Require 语句及设置。
    * `PlayFabClientApi` 允许你进行客户端 API 调用——这就是你在这里的原因。
    * IPlayFabHttps 和 PlayFabHttps\_Defold：
      * PlayFab Defold 插件基于 PlayFab LuaSdk 构建。Lua 语言没有正式的 HTTPS 模块。每个使用 Lua 的游戏引擎都自行实现。这两个变量告诉 PlayFabSdk 如何访问 HTTPS。你只需在项目中的第一个场景中执行一次。否则这只是必需的模板代码。

  * `PlayFabClientApi.settings.titleId = "144"`
    * 每个使用 PlayFab 的项目都应在 PlayFab 网站（我们称之为 Game Manager）上创建一个唯一的标题。在 Game Manager 中找到你的 `titleId`，并将 `144` 替换为你的 `titleId`。

  * `function init(self)`
    * Defold 函数——在 GUI 初始化时调用。

  * `local loginRequest = { TitleId = PlayFabClientApi.settings.titleId, CustomId = "GettingStartedGuide", CreateAccount = true }`
    * 大多数 PlayFab API 方法需要输入参数，这些输入参数被打包到请求对象中
    * 每个 API 方法都需要一个唯一的请求对象，其中包含可选和必需参数的组合
      * 对于 `LoginWithCustomIDRequest`，有一个必需参数 `CustomId`（唯一标识玩家）和 `CreateAccount`（允许此调用创建新帐户）。
    * 对于登录，大多数开发者会希望使用更适合的登录方法
      * 请参阅 [PlayFab 登录文档](xref:titleid.playfabapi.com.client.authentication) 了解所有登录方法及输入参数的列表。常见选择包括：
        * [LoginWithAndroidDeviceID](xref:titleid.playfabapi.com.client.authentication.loginwithandroiddeviceid)
        * [LoginWithIOSDeviceID](xref:titleid.playfabapi.com.client.authentication.loginwithiosdeviceid)
        * [LoginWithEmailAddress](xref:titleid.playfabapi.com.client.authentication.loginwithemailaddress)

  * `PlayFabClientApi.LoginWithCustomID(loginRequest, OnLoginSuccess, OnLoginFailed)`
    * 这会使用请求执行 API 调用，并提供成功和失败情况的回调函数。

  * `function OnLoginSuccess(result)`
    * 许多 API 成功回调的 result 对象将包含所请求的信息。
    * `LoginResult` 包含关于玩家的一些基本信息，但对大多数用户而言，登录只是调用其他 API 之前的必需步骤。

  * `function OnLoginFailed(error)`
    * API 调用可能因多种原因失败，你应始终尝试处理失败情况。

    * API 调用失败的原因（按可能性排序）
      * 未设置 PlayFabSettings.TitleId。如果忘记将 titleId 设为你的标题，则任何操作都无法运行。

      * 请求参数。如果你没有为特定 API 调用提供正确或必需的信息，则调用将失败。请查看 `error.errorMessage`、`error.errorDetails` 或 `error.GenerateErrorReport()` 获取更多信息。

      * 设备连接问题。手机连续地失去/重连网络，因此任何时候的任何 API 调用都可能随机失败，随后又立即成功。进入隧道可能会让你完全断开连接。

      * PlayFab 服务器问题。与所有软件一样，可能会出现问题。请参阅我们的 [发行说明](/services/playfab/release-notes) 获取更新。

      * 互联网并非 100% 可靠。有时消息会损坏或无法到达 PlayFab 服务器。

    * 如果你在调试问题时遇到困难，且错误信息中的内容不够充分，请访问我们的 [论坛](https://community.playfab.com/index.html)

  * `local pfTestOutput = gui.get_node("pfOutput")`
    * 这是另一个 Defold GUI 函数。它获取在 PfGettingStarted.gui 文件中定义的 `pfOutput` GUI 对象，并为其赋予要显示给用户的文本。


## Related topics

- [适用于 Corona 的 Lua 快速入门](/zh-CN/services/playfab/sdks/lua/quickstart-corona.md)
- [适用于 Linux 的 C++ 快速入门](/zh-CN/services/playfab/sdks/playfab-cpp/quickstart-linux.md)
- [适用于 Windows 的 C++ 快速入门](/zh-CN/services/playfab/sdks/playfab-cpp/quickstart-windows.md)
- [Unreal Engine 快速入门](/zh-CN/services/playfab/sdks/unreal/quickstart.md)
- [适用于 GDK 的 C/C++ 快速入门](/zh-CN/services/playfab/sdks/playfab-cpp/quickstart-gdk.md)
