会话和玩家匹配

概述

玩家匹配是使用 会话 来匹配 玩家 的过程。会话 本质上是使用给定的属性集在服务器上运行的游戏实例,它可能是 广告 形式,这样就可以让想要玩游戏的玩家发现和加入,也可能是 私密 形式,这样只有以某种形式受到邀请或通知的玩家可以加入。

想象列出了当前正在进行的所有游戏的在线游戏大厅。每个列表中的游戏都是会话,或单独的在线比赛。可以通过搜索或其他方式来匹配会话中的玩家,然后玩家加入会话来玩游戏。

会话的基础生命周期是:

  • 使用所需设置创建新会话

  • 等待玩家申请加入比赛

  • 注册想要加入的玩家

  • 开始会话

  • 玩游戏

  • 终止会话

  • 取消玩家注册

  • 或者:

    • 如果您想要变更比赛类型并返回以等待玩家加入,则更新会话

    • 终止会话

会话接口

Session Interface (会话接口),IOnlineSession,提供了用于执行玩家匹配所需的后台设置以及其他让玩家搜寻和加入在线游戏的方式的平台特定的功能。这包括了会话管理,通过搜索或其他方式来搜寻会话,以及加入和离开这些会话。会话界面由OnlineSubsystem来创建和所有。这表示它仅存在于服务器上。

在每个平台上只有一个会话接口类。当为新平台添加支持时,必须创建新类型的会话接口。这里说的平台指的是硬件平台。这种情况下,一次只能存在一个会话接口-即引擎当前正在运行的平台上的会话接口。

会话接口执行所有的会话处理,游戏一般不直接与其进行互动。一般来说, 游戏会话AGameSession,作为会话接口周围的游戏特定封装,并且游戏代码在其需要与会话进行互动时会对其进行调用。游戏会话由游戏模式AGameMode所创建和拥有,并且仅在运行在线游戏时存在于服务器上。

每个游戏都可以有多种游戏会话类型,但一次只能使用一种。游戏具有不止一种会话的最常见例子是在游戏使用专门的服务器时来添加游戏会话类型。

会话设置

会话设置FOnlineSessionSettings类定义,是决定会话特性的属性集。在基础应用中,一般具有如下属性:

  • 允许的玩家数量

  • 该会话为广告会话还是私密会话

  • 该会话是否为局域网比赛

  • 该服务器为专用还是由玩家作为主机

  • 是否允许邀请玩家

  • 等等.

以在线游戏大厅的示例来说,每个游戏都是会话,并且具有其会话设置。举例来说,一些会话可能为玩家对玩家(PVP),而另一些会话为合作式的多人游戏(Co-Op)。不同的会话可能会使用不同的地图或游戏列表,需要不同数量的玩家,等等。

会话管理

会话接口的主要任务之一是会话管理,包括会话设置,更新以及退出。

创建会话

为能让玩家找到会话并加入,您需要创建会话并设置其属性,并决定哪些属性可见,这样可以对其进行搜索。

会话使用IOnlineSession::CreateSession()进行创建,它使用会话设置集来配置新会话。当会话被创建后,会触发OnCreateSessionComplete代理。

更新会话

当您想要变更已存会话设置并使用IOnlineSession::UpdateSession()函数来执行时,更新会话完成。举例来说,当前会话可能设置为只允许8个玩家,而下一场游戏需要允许12个玩家的加入。如需更新会话,UpdateSession()将被调用,传递指定最高12名玩家的新会话设置。

当申请更新会话完成后,触发OnUpdateSessionComplete代理。这提供了执行任意配置或所需的初始化以处理会话设置变更的条件。

更新会话一般在服务器上的比赛之间进行,但也会在客户端执行以保持会话信息的同步。

退出会话

当会话结束并且不再需要时,我们使用IOnlineSession::DestroySession()函数来退出会话。当退出会话完成时,触发OnDestroySessionComplete代理,从而让您执行清理操作。

玩家匹配 - 搜寻会话

在线子系统提供了将玩家按照活动会话进行匹配的必要基础构建块。它不会提供任意特定类型的内置了基础应用的玩家匹配。但是,提供玩家匹配服务的平台上的应用向这些服务开放了访问权限。这是搜寻会话以供玩家加入的过程。当我们搜寻到该会话,玩家可以加入会话

搜索会话

搜寻会话最简单的方法是搜寻匹配所需设置子集的会话。这可以是在用户接口中对用户选择筛选器的集合所作出的响应,也可以是基于玩家的技巧和其它因素在后台自动进行,或者是这两种方法的综合。

搜索会话的最为基础的形式是传统的服务器浏览器,它会显示所有可玩的游戏并让玩家基于他们想玩的游戏类型来进行筛选,并选择加入符合这些标准的会话之一。

如需搜索会话,使用IOnlineSession::FindSessions()并传递引用到会话设置以搜索FOnlineSessionSearch对象。会话设置引用的SearchResults成员与游戏会话一起弹出。当搜素完成时,触发OnFindSessionsComplete代理。在此代理中,您可以通过搜索结果进行迭代。

基于云端的玩家匹配

基于云端的玩家匹配指的是内置的可用的玩家匹配服务,并且一般是特定平台的。此类型服务的一个示例是通过微软的Xbox Live服务所提供的TrueSkill(真实技巧)系统。

如需对支持玩家匹配的平台进行其初始化,您可以调用IOnlineSession::Startmatchmaking()并传递给它用以匹配的玩家控制器数量,会话名称,创建新会话所需的会话设置,以及搜索的设置。当玩家匹配完成时,会触发OnMatchmakingComplete代理。这提供了定义过程是否成功的布尔值以及待加入的会话名称的信息。

正在运行中的玩家匹配操作可以通过调用IOnlineSession::CancelMatchmaking()来取消,并且可以在一开始就通过传递玩家控制器数量和传递到调用中的会话名称来开始玩家匹配。当取消操作完成时,会调用OnCancelMatchmakingComplete代理。

跟随并邀请好友

在支持好友的平台上,玩家可以跟随好友进入会话或邀请好友加入会话。

您可以通过调用IOnlineSession:FindFriendSession()来跟从好友进入会话,并传递本地想要加入会话的玩家数量和已经在会话中的玩家ID到其中。当找到会话并且其包含可用于加入会话的搜索结果时,触发OnFindFriendSessionComplete代理。

玩家也可以使用IOnlineSession:SendSessionInviteToFriend()IOnlineSession::SendSessionInviteToFriends() 来邀请一个或多个好友加入他们的当前会话,并传递本地玩家数量,会话名称以及待邀请的玩家ID的信息。当好友接受邀请时,包含待加入的会话的搜索结果的OnSessionInviteAccepted代理被触发。

加入会话

当您确定了供玩家加入的会话时,加入的过程通过调用IOnlineSession::JoinSession()并传递玩家数量、名称和待加入的会话的搜索结果来初始化。当加入会话完成时,触发OnJoinSessionComplete代理。此时逻辑会让玩家加入已经进行的游戏。首先,您需要调用IOnlineSession::GetResolvedConnectString(),它会返回加入游戏的平台特定连接信息。从此函数中获得的字符串可以随后被传递到APlayerController::ClientTravel()UWorld::Servertravel()以将玩家传递到游戏中。