快速入门:PlayFab 多人游戏 Unity 插件

PlayFab 多人游戏 Unity 插件入门。 按照下面的步骤安装程序包,并尝试使用基本任务的示例代码。

本快速入门可帮助使用 PlayFab 多人游戏 SDK for Unity 进行首次 API 调用。 在继续之前,请确保你已完成快速入门:Unity 中适用于 C# 的 PlayFab 客户端库,这可确保你拥有一个 PlayFab 帐户,并且熟悉如何从你的游戏和 PlayFab Game Manager 登录 PlayFab。

注意

如果你打算使用此插件开发基于 Microsoft 游戏开发工具包 (GDK) 的游戏,则需要单独获取并安装 GDK。 另请参阅有关 Xbox 主机上适用于 Game Core 的 Unity 附加内容的详细信息。

要求

  • 一个 PlayFab 开发者帐户

  • Unity 编辑器的已安装副本。 若要通过 Unity Hub 或 Unity+ 安装 Unity 以供个人使用,请参阅下载 Unity。 如果需要,请在特定平台的文档中查看 Unity 支持。 支持的最低 Unity 版本是 Unity 2017 LTS。

  • Unity 项目 - 这可以是以下任一项:

    • 一个全新的项目:有关详细信息,请参阅首次启动 Unity
    • 引导式教程项目。 有关详细信息,请参阅 Unity 入门
    • 一个现有项目。
  • PlayFab“core”Unity3D SDK(也包含在多人游戏 Unity 插件中)。 有关安装 Unity3D SDK 的信息,请参阅快速入门:Unity 中适用于 C# 的 PlayFab 客户端库中的“下载并安装 PlayFab SDK”部分。

下载并安装 PlayFab 多人游戏 Unity 插件

按照步骤下载并安装 PlayFab 多人游戏 Unity 插件。

  1. 下载 PlayFab 多人游戏 Unity 插件资产包(根据你的平台使用分发点)。
  2. 重要事项! 请参阅随插件发布的自述文件中的信息。 它针对每个特定版本量身定制,并且可能包含特定于你的平台的重要说明。
  3. 打开你的 Unity 项目。
  4. 导航到保存 .unitypackage 的位置并双击它以打开导入对话框。
  5. 若要将 PlayFab 多人游戏 Unity 插件导入项目,请选择“导入”。

注意:如有必要,可能需要安装较新版本的 PlayFab“core”Unity SDK。

设置场景

指南的这一部分介绍了如何将 PlayfabMultiplayerEventProcessor 添加到你的场景,以便你能够从 Unity 调用 PlayFab 多人游戏 API。

必须先登录 PlayFab 玩家,然后才能使用多人游戏 API。 有关登录播放器的信息,请参阅快速入门:Unity 中适用于 C# 的 PlayFab 客户端库中的“进行首次 API 调用”。

  1. 在 Unity 编辑器的“项目”窗口中,导航到 资产> PlayFabMultiplayerSDK > Prefabs

  2. 在 Prefabs 文件夹中,将 PlayfabMultiplayerEventProcessor 拖放到“层次结构”窗口中的场景。

  3. 在场景中创建名为“HelloPartyLogic”的空游戏对象。

  4. 选择 HelloMultiplayerLogic 游戏对象以打开检查器

  5. 选择“添加组件”。

  6. 键入“HelloPartyLogic”,然后按 Enter 以显示新的脚本菜单。

  7. 再次按 Enter 创建新脚本 HelloMultiplayerLogic.cs。

  8. 在“项目”窗口中找到脚本并双击它以编辑脚本。

  9. 将以下 using 语句添加至脚本:

    using PlayFab;
    using PlayFab.Multiplayer;
    using PlayFab.ClientModels;
    
  10. 在 Start 方法中添加以下代码以登录 PlayFab。

    // Log into playfab
    var request = new LoginWithCustomIDRequest { CustomId = UnityEngine.Random.value.ToString(), CreateAccount = true };
    PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);
    
  11. 将以下方法添加到类。

    private void OnLoginSuccess(LoginResult result)
    {
    }
    
    private void OnLoginFailure(PlayFabError error)
    {
    }
    

注意

你可能会收到以下错误:

Error    CS0227    Unsafe code may only appear if compiling with /unsafe
The plugin requires unsafe code because it interops with a native DLL.

Mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "XGamingRuntime", "AMD64".

Microsoft GDK 和 Windows 仅支持 x64。

若要解决这些问题,请执行以下操作:

  1. 在 Unity 编辑器中,选择“文件 > 生成设置”。
  2. 选择你的平台。 然后,从“体系结构”下拉列表中选择 x86_64 或 x64。
  3. 选择“玩家设置”。
  4. 在右窗格中,选择“其他设置”。
  5. 找到“允许不安全的代码”设置并将其选中。
  6. 关闭“生成设置”和“项目设置”窗口。

创建和加入大厅

指南的这一部分介绍如何创建和加入网络。

  1. 打开 HelloMultiplayerLogic.cs 脚本。 在 OnLoginSuccess 方法中,添加以下代码以创建和加入网络:

    string entityId = ...; // PlayFab user's entity Id
    string entityType = ...; // PlayFab user's entity type
    
    PlayFabMultiplayer.OnLobbyCreateAndJoinCompleted += this.PlayFabMultiplayer_OnLobbyCreateAndJoinCompleted;
    PlayFabMultiplayer.OnLobbyDisconnected += this.PlayFabMultiplayer_OnLobbyDisconnected;
    
    var createConfig = new LobbyCreateConfiguration()
    {
        MaxMemberCount = 10,
        OwnerMigrationPolicy = LobbyOwnerMigrationPolicy.Automatic,
        AccessPolicy = LobbyAccessPolicy.Public
    };
    
    createConfig.LobbyProperties["Prop1"] = "Value1";
    createConfig.LobbyProperties["Prop2"] = "Value2";
    
    var joinConfig = new LobbyJoinConfiguration();
    joinConfig.MemberProperties["MemberProp1"] = "MemberValue1";
    joinConfig.MemberProperties["MemberProp2"] = "MemberValue2";
    
    PlayFabMultiplayer.CreateAndJoinLobby(
        new PFEntityKey(
            entityId,
            entityType),
        createConfig,
        joinConfig);
    
  2. 若要定义 OnLobbyCreateAndJoinCompleted 事件处理程序,请将以下代码添加到类:

    private void PlayFabMultiplayer_OnLobbyCreateAndJoinCompleted(Lobby lobby, int result)
    {
        if (LobbyError.SUCCEEDED(result))
        {
            // Lobby was successfully created
            Debug.Log(lobby.ConnectionString);
        }
        else
        {
            // Error creating a lobby
            Debug.Log("Error creating a lobby");
        }
    }
    
  3. 若要定义 OnLobbyDisconnected 事件处理程序,请将以下代码添加到类:

    private void PlayFabMultiplayer_OnLobbyDisconnected(Lobby lobby)
    {
        // Disconnected from lobby
        Debug.Log("Disconnected from lobby!");
    }
    
  4. 在 Unity 编辑器中保存并选择“播放”。 大厅连接字符串显示在控制台窗口中。

加入大厅

指南的这一部分将介绍如何加入另一个客户端创建的现有大厅。

  1. 打开 HelloMultiplayerLogic.cs 脚本。 在 OnLoginSuccess 方法中,添加以下代码以加入大厅:

    PFEntityKey entityKey = ...; // PlayFab user's entity key
    
    string connectionString = "<your lobby connection string>";
    
    PlayFabMultiplayer.JoinLobby(
            entityKey,
            connectionString,
            null);
    
  2. 若要定义本地客户端加入大厅时触发的事件,请将以下代码添加到 OnLoginSuccess 方法:

    PlayFabMultiplayer.OnLobbyJoinCompleted += this.PlayFabMultiplayer_OnLobbyJoinCompleted;
    
  3. 若要定义 OnLobbyJoinCompleted 事件处理程序,请将以下代码添加到类:

    private void PlayFabMultiplayer_OnLobbyJoinCompleted(Lobby lobby, PFEntityKey newMember, int reason)
    {
        if (LobbyError.SUCCEEDED(reason))
        {
            // Successfully joined a lobby
            Debug.Log("Joined a lobby");
        }
        else
        {
            // Error joining a lobby
            Debug.Log("Error joining a lobby");
        }
    }
    
  4. 在 Unity 编辑器中保存并选择“播放”。 字符串“已加入大厅”显示在控制台窗口中。

查找大厅

本指南的此部分介绍如何查找其他客户端创建的现有大厅。

  1. 打开 HelloMultiplayerLogic.cs 脚本。 在 OnLoginSuccess 方法中,添加以下代码以加入网络:

    PFEntityKey entityKey = ...; // PlayFab user's entity key
    
    LobbySearchConfiguration config = new LobbySearchConfiguration();
    PlayFabMultiplayer.FindLobbies(entityKey, config);
    
  2. 若要定义本地客户端查找大厅时触发的事件,请将以下代码添加到 OnLoginSuccess 方法:

    PlayFabMultiplayer.OnLobbyFindLobbiesCompleted += this.PlayFabMultiplayer_OnLobbyFindLobbiesCompleted;
    
  3. 若要定义 OnLobbyFindLobbiesCompleted 事件处理程序,请将以下代码添加到类:

    private void PlayFabMultiplayer_OnLobbyFindLobbiesCompleted(
        IList<LobbySearchResult> searchResults, 
        PFEntityKey newMember, 
        int reason)
    {
        if (LobbyError.SUCCEEDED(reason))
        {
            // Successfully found lobbies
            Debug.Log("Found lobbies");
    
            // Iterate through lobby search results
            foreach (LobbySearchResult result in searchResults)
            {
                // Examine a search result
            }
        }
        else
        {
            // Error finding lobbies
            Debug.Log("Error finding lobbies");
        }
    }
    
  4. 在 Unity 编辑器中保存并选择“播放”。 “找到的大厅”字符串显示在控制台窗口中。

创建匹配票证

本指南的这一部分演示如何创建匹配票证。 请将它与下面另一个客户端上的“加入匹配票证”方案一起运行。

  1. 打开 HelloMultiplayerLogic.cs 脚本。 在方法中 OnLoginSuccess ,添加以下代码以创建匹配票证:

    PFEntityKey entityKey = ...; // PlayFab user's entity key
    PFEntityKey remoteEntityKey = ...; // another PlayFab user's entity key
    string remoteUserAttributesJson = ...; // JSON string with another PlayFab user's attributes for matchmaking
    
    PlayFabMultiplayer.OnMatchmakingTicketStatusChanged += PlayFabMultiplayer_OnMatchmakingTicketStatusChanged;
    
    List<MatchUser> localUsers = new List<MatchUser>();
    localUsers.Add(new MatchUser(entityKey, remoteUserAttributesJson));
    
    List<PFEntityKey> membersToMatchWith = new List<PFEntityKey>();
    membersToMatchWith.Add(remoteEntityKey);
    
    PlayFabMultiplayer.CreateMatchmakingTicket(
        localUsers,
        "QuickMatchQueueName",
        membersToMatchWith);
    
  2. 若要定义 OnMatchmakingTicketStatusChanged 事件处理程序,请将以下代码添加到类:

    private void PlayFabMultiplayer_OnMatchmakingTicketStatusChanged(MatchmakingTicket ticket)
    {
        // Store and print matchmaking ticket
        Debug.Log(ticket.TicketId);
    
        // Examine matchmaking ticket status
        Debub.Log(ticket.Status)
    
        // Share matchmaking ticket with other clients taking part in matchmaking
    
        // Examine ticket
    }
    
  3. 在 Unity 编辑器中保存并选择“播放”。

如果指定了 membersToMatchWith,将触发一个 OnMatchmakingTicketStatusChanged 事件处理程序,状态将为 WaitingForPlayers。 在这种情况下,当另一个客户端调用 JoinMatchmakingTicketFromId 后,将触发新的 OnMatchmakingTicketStatusChanged 事件处理程序,这次的状态将为 WaitingForMatch。

或者,将触发一个 OnMatchmakingTicketStatusChanged 事件处理程序,并且状态将为 WaitingForMatch。

创建匹配票证

指南的这一部分将介绍如何加入另一个客户端创建的现有网络。 请将它与上述另一个客户端上的“创建匹配票证”方案一起运行。

  1. 打开 HelloMultiplayerLogic.cs 脚本。 在 OnLoginSuccess 方法中,添加以下代码以匹配票证:

    PFEntityKey entityKey = ...; // PlayFab user's entity key
    string ticketId = ...; // Matchmaking ticket obtained from the client that created the ticket
    
    PlayFabMultiplayer.OnMatchmakingTicketCompleted += PlayFabMultiplayer_OnMatchmakingTicketStatusChanged;
    
    // Create JSON string with PlayFab user's attributes for matchmaking. This will need to be shared with other clients taking part in matchmaking
    string uniqueId = System.Guid.NewGuid().ToString();
    string userAttributesJson = "{\"MatchIdentifier\": \"" + uniqueId + "\"}";
    
    PlayFabMultiplayer.JoinMatchmakingTicketFromId(
        new MatchUser(entityKey, userAttributesJson),
        ticketId,
        "QuickMatchQueueName",
        new List<PFEntityKey>());
    
  2. 若要定义 OnMatchmakingTicketStatusChanged 事件处理程序,请将以下代码添加到类:

    private void PlayFabMultiplayer_OnMatchmakingTicketStatusChanged(MatchmakingTicket ticket)
    {
        // Store and print matchmaking ticket
        Debug.Log(ticket.TicketId);
    
        // Examine matchmaking ticket status
        Debub.Log(ticket.Status)
    
        // Share matchmaking ticket with other clients taking part in matchmaking
    
        // Examine ticket
    }
    
  3. 在 Unity 编辑器中保存并选择“播放”。

将触发一个 OnMatchmakingTicketStatusChanged,状态为 WaitingForMatch。

完成匹配票证

本指南的此部分介绍如何完成匹配。 请将它与上述另一个客户端上的“创建匹配票证”方案一起运行。 (可选)可以将其与“加入匹配票证”方案一起运行。

  1. 在同一队列中的多个票证有资格匹配后,将找到匹配项。 在这种情况下,将触发 OnMatchmakingTicketCompleted 事件处理程序。

  2. 订阅 OnMatchmakignTicketCompleted 处理程序

    PlayFabMultiplayer.OnMatchmakingTicketCompleted += PlayFabMultiplayer_OnMatchmakingTicketCompleted;
    
  3. 若要定义 OnMatchmakingTicketCompleted 事件处理程序,请将以下代码添加到类:

    private void PlayFabMultiplayer_OnMatchmakingTicketCompleted(MatchmakingTicket ticket, int result)
    {
        if (LobbyError.SUCCEEDED(result))
        {
            // Successfully completed matchmaking ticket
            Debug.Log("Completed matchmaking ticket");
    
            // Examine matchmaking details
            MatchmakingMatchDetails details = ticket.GetMatchDetails();
        }
        else
        {
            // Error completing a matchmaking ticket
            Debug.Log("Error completing a matchmaking ticket");
        }
    }