- 使用 PlayFab 对 Photon 玩家进行身份验证。
- 使用 PlayFab CloudScript 回调侦听房间事件。
Photon 快速入门
本快速入门介绍如何设置 Photon Multiplayer 与 PlayFab 协同工作。目前,PlayFab 提供以下 Photon 集成:- 使用 PlayFab 对 Photon 玩家进行身份验证。
- 使用 PlayFab CloudScript 回调侦听房间事件。
有关 Unity 上完全受支持的 PlayFab 多人游戏和聊天体验,请参阅 PlayFab Party Unity 插件获取更多信息。
先决条件
- 一个已导入 PlayFab SDK 并已配置游戏的 Unity 项目。
- 已注册的 PlayFab 游戏。
本指南省略了 Chat 应用程序的设置。若要集成 Chat 应用程序,请创建一个新的 Photon Chat 应用程序,并在 Unity 中以及 PlayFab Game Manager - Photon Add-on 页面中相应的框中输入 App ID。
设置 Photon 应用程序
- 注册并登录到 Photon 仪表板后,选择 Create a new App。

- 选择 Photon Type。
- 选择 Name。
- 创建 Description。
- 通过选择 Create 提交。

设置身份验证
- 在列表中找到新创建的应用程序,然后选择 Manage。

- 在 Application 仪表板中,找到并保存位于页面 Title 下的 App ID。

- 找到 Authentication 部分。
- 选择 Custom Server。

PlayFabTitleId 占位符替换为你自己的 Title Id。
- 输入 URL。
- 通过选择 Create 按钮提交。

为 Photon 设置 PlayFab 游戏
导航到游戏的 Game Manager 页面,然后:- 导航到 Add-ons 选项卡。
- 在 Add-ons 列表中,找到并选择 Photon。

- Photon Add-on 页面允许你通过指定 Photon Realtime Application ID 来安装 Photon。
- 或者,你也可以指定 Chat App ID。
- 安装 Add-on (3) 后,会生成 Photon secret Key (2)。
- 保存它以便将来配置 Webhook 时使用。
请记得将 Photon secret key 保存在安全且易于访问的位置。它在配置 Webhook 时会派上用场。

设置 Photon Webhook
作为可选集成,Photon 可以将某些事件传输到你的 PlayFab CloudScript。这是通过 Webhook 完成的:- 你指定一个 Base URL。
- 然后为每个可用事件指定路径。
- 实际上,路径就是你 CloudScript 中实现的处理程序名称。
Title Id 占位符替换为你自己的 Title Id。
PhotonSecretKey 令牌替换为你在 Photon Add-on 页面上生成的密钥。
- 填写 Base URL。
- 为每个可用的 Events 指定一个 CloudScript 处理程序 Name。
- 移除所有 CustomHttpHeaders。
- 通过选择 Save 按钮提交。

设置 Unity 项目
本指南假设你已导入 PlayFab SDK、完成设置,并配置了游戏设置。- 开始时导航到 Asset Store。
- 找到 Photon Unity Networking Free 包。
- 选择 Import (1)。
- 你可以检查导入的文件。
- 然后选择 Import (2)。

- 输入你为所创建的 Photon App 在 Photon Application Dashboard 中找到的 Realtime Application ID (1)。
- 选择 Setup Project (2)。
- 设置完成后,选择 Close (3)。

- 导航到顶部窗口面板。
- 选择 Window。
- 然后选择 Photon Unity Networking (1)。
- 最后选择 Highlight Server Settings (2)。
- Standard Unity 项目窗口会显示 PhotonServerSettings (3) 对象。
- 选择该对象以在 Unity Inspector 窗口中查看其设置。

作为 PhotonServerSettings 的一部分,你可以选择指定 Chat Application ID。
实现从 PlayFab 到 Photon 的身份验证
当你在 PlayFab Game Manager 中为游戏启用 Photon Add-on,并在 Photon Application 仪表板上配置身份验证时,PlayFab 允许你在 Photon 环境中对现有的 PlayFab 玩家进行身份验证。 这意味着你可以完全避免为 Photon 实现任何用户管理。- 从 Photon Unity Networking Free 包(Classic 版本)导航到 DemoHub-Scene-V2 场景。
- 此场景是包中所有示例的中心。
- 因为它是要加载的第一个场景,让我们添加一个小脚本来启用使用 Photon 对 PlayFab 进行身份验证。
- 创建一个名为 PlayFabAuthenticator 的空 GameObject。
- 然后在 Unity Inspector 窗口中,向此 GameObject 添加一个同名组件。

PlayFabAuthenticator 组件的代码,然后保存并关闭文件。
测试从 PlayFab 到 Photon 的身份验证
- 启动场景。
- 检查控制台消息的流。 控制并确保:
- 到 PlayFab 本身的身份验证成功。
- 已获取 Photon 令牌。

- 若要确保 PlayFab 身份验证完成,请选择 Demo Boxes。
- 然后如下图所示选择 Load Demo。


Photon 房间事件 + CloudScript
Photon 匹配系统有一个 Room(房间)的概念。如果你不熟悉此概念,请参阅 Photon 匹配指南。 PlayFab 允许你拦截各种房间事件。以下房间事件仅需 CloudScript 即可拦截:RoomCreatedRoomJoinedRoomLeftRoomClosed
RoomPropertyUpdatedRoomEventRaised
一旦你为某个房间事件引入了处理程序,它就成为事件处理流程的重要组成部分。因此,你的 CloudScript 在运行时产生的错误可能会对整个系统造成问题。例如,如果
RoomCreated 处理程序抛出错误,你的客户端也会抛出错误,并且将无法正确连接。Room Created 处理程序
每次创建 Photon 房间时都会调用RoomCreated 处理程序。以下 CloudScript 处理程序拦截此类事件。
你可以使用 “args” 参数获取有关该事件的更多数据。
Room Joined 处理程序
每次有玩家加入房间时都会调用RoomJoined 处理程序。以下 CloudScript 处理程序拦截此类事件。
RoomCreated 来拦截第一个加入的玩家。你可以使用 “args” 参数获取有关该事件的更多数据。
Room left
每次有玩家离开房间时都会调用RoomLeft 处理程序。以下 CloudScript 处理程序拦截此类事件。
Room Closed 处理程序
每次最后一位玩家离开房间导致房间没有玩家时,都会调用RoomClosed 处理程序。以下 CloudScript 处理程序拦截此类事件。
Room Property Updated
每次房间属性发生更改时都会调用RoomPropertyUpdated 处理程序。以下 CloudScript 处理程序拦截此类事件。
此处理程序中的
currentPlayerId 未定义。如果房间属性是从客户端更改的,你可以使用 “args” 参数,并参考 UserId 来获取负责此操作的玩家。Room Event Raised
每次触发自定义房间事件时都会调用 Room Event Raised。以下 CloudScript 处理程序拦截此类事件。测试 Room Event 处理程序
此示例扩展了前面的示例(PlayFab + Photon 身份验证)。 为你的游戏上传以下 CloudScript。PlayFabAuthenticator 脚本,该示例代码会触发自定义事件并设置自定义房间属性。扩展版本还使用 Awake 方法,以便在场景加载之间不销毁对象。
- 运行 hub 场景并等待 PlayFab 身份验证完成 (1)。
- 然后加载 Boxes Demo 场景 (2)。

- 场景加载完成后,等待对等方连接到新创建的房间 (1)。
- 然后在左上角选择 Execute Example (2)。
- 观察控制台输出 (3)。
- 确保没有发生错误。

- 最初,我们的 Photon 实例没有打开的房间。当我们启动示例时,Photon 为 Boxes Demo 创建了房间。
- 第一个加入的玩家就是请求创建房间的玩家。因此没有记录 RoomJoined Event。然后我们执行了示例代码:
- 首先,我们触发了一个自定义 Room Event。
- 然后,我们设置了一个自定义 Room Property。
- 然后我们停止了 Unity 播放模式。这导致我们的客户端离开了房间。
- 由于我们断开连接的客户端是最后一个,没有更多客户端,Photon 关闭了房间。

