会话生命周期
1.根据设定生成会话
2.等待玩家请求加入匹配
3.注册玩家
4.启用会话
5.打比赛
6.结束会话
7.注销玩家
8.二选一:
如果你想改变比赛类型那么更新会话,返回等待玩家进入
注销会话
会话接口
会话接口IOnlineSession,提供了特定于平台的功能,用于在幕后设置所需的片段,以便执行匹配以及允许玩家查找和加入在线游戏的其他方法。
这包括会话管理,通过搜索或其他方法查找会话,以及参加或离开这些会话。
创建会话接口由在线子系统拥有。意味着这只存在于服务器上。
一次只存在一个会话接口——引擎当前运行的平台的会话接口。
虽然会话接口执行所有的会话处理,但游戏通常不会直接与它交互。
相反,游戏会话(AGameSession)充当特定于游戏的包装器,当需要与会话交互时,会话接口和游戏代码会调用它。
GameSession被GameMode创建和拥有,而且当运行一个在线游戏时,它只存在于服务器上。
会话设置
会话设置,由‘FOnlineSessionSettingscalss’定义,是一组确定会话特征的属性。
在基本实现里,这些内容包括:
1.允许的玩家数量
2.会话是共公开还是私有的
3.是否局域网会话
4.是服务器专用或是玩家托管的会话
5.允许邀请的会话
用一个在线Lobby游戏例子,每个游戏都是一个会话,且有自己的会话设置。
例如,有些会话是PVP,有些是Co-Op(合作多人游戏)。
不同的会话可以呈现不同的地图、玩家列表、不同的游戏人数等等。
会话管理
所有会话节点都是异步任务(时钟),当完成时,会调用‘OnSucess’或‘OnFailure’。同时,你能用最上层exec输出。
创建会话
为了让玩家找到会话和可能加入它,你需要创建一个会话和设置它的属性,决定哪些属性可见。
当前引擎版本可能不支持通过蓝图注册专用服务器会话。
在C++中,你应该通过重写‘RegisterServer’函数在AGameSession中进行常规的C++会话创建!
通过蓝图创建会话
要在蓝图里创建会话,你可以使用Epic暴露给开发者的“CreateSession”节点。
它没有提供很多选项,但可以通过论坛里的插件进行扩展。
通过C++创建会话
https://wiki.unrealengine.com/How_To_Use_Sessions_In_C++#Creating_a_Session
更新会话
更新是在你希望更改现有会话的设置时完成的,使用‘IOnlineSession::UpdateSession()’函数完成。
例如,原会话只允许8个玩家,但下一场比赛需要12个玩家。为了更新这个会话,‘UpdateSession()’将会被调用,指定最多12个玩家兵传递给新会话。
当更新会话请求完成,会触发‘OnUpdateSessionComplete’代理。为会话设置更改所需要的配置和初始化提供了机会。
更新会话是常在服务器的游戏中出现的,但为了会话信息同步,也会在客户端上出现。
这个函数没有蓝图版本,但论坛的插件可以扩展。
销毁会话
当会话结束且不再需要时,使用‘IOnlineSession::DestroySession()’函数销毁这个会话。
‘OnDestroySessionComplete’代理被触发,让你进行清理操作。
通过蓝图销毁会话
用Epic暴露的‘DestroySession’节点销毁会话。
通过C++销毁会话
https://wiki.unrealengine.com/How_To_Use_Sessions_In_C++#Destroying_a_Session
查找会话
查找会话最简单的方法是,搜索匹配某些所需设置子集的会话。
这可能是玩家在UI通过过滤器来寻找的回应,或基于玩家的能力和其他因素在后台处理完成的,也可能是这两种方法结合。
查找会话最基本的形式是经典的服务器浏览器,它显示所有有效游戏,并允许玩家根据他们想玩的游戏类型进行过滤。
通过蓝图搜索会话
你可以用‘FindSessions’节点。如果你想搜索局域网或在线游戏,你可以指定搜索结果的数量。
更多功能通过论坛插件。
通过C++搜索会话
https://wiki.unrealengine.com/How_To_Use_Sessions_In_C++#Searching_and_Finding_a_Session
进入会话
一旦确定要加入的会话,就可以通过调用‘IOnlineSession::JoinSession()’,传递要加入会话的玩家人数、名称、搜索结果。
当连接完成,‘OnJoinSessionComplete’代理被触发。这就是让玩家进入比赛的逻辑所在。
关于这个逻辑的更多信息可以在下面作者的博客里面阅读。
通过蓝图加入会话
为了加入会话,可用‘JoinSession’节点。
它需要传入‘FindSession’提供的搜索结果数组。
‘JoinSession’节点会直接连接映射‘OnSuccess’,这你不需要处理。
通过C++加入会话
https://wiki.unrealengine.com/How_To_Use_Sessions_In_C++#Joining_a_Session
基于云的匹配
基于云的匹配是指可用的内置匹配服务,通常是特定于平台的。
这类服务的一个例子是通过Microsoft Xbox Live服务提供的TrueSkill系统。
要在支持它的平台上发起配对,可以调用'IOnlineSession::Startmatchmaking()',并将玩家的人数、会话名、创建新会话时要使用的会话设置和要搜索的设置传递给它。
“OnMatchmakingComplete”委托在匹配完成时触发。
这提供了一个bool,指定流程是否成功,以及在这种情况下要连接的会话的名称。
可以通过调用'IOnlineSession::CancelMatchmaking()'来取消正在进行的匹配操作,并将玩家的人数和最初传递给调用以开始匹配的SessionName传递给它。
“OnCancelMatchmakingCompletedelegate”在取消操作完成时触发。
跟踪或邀请好友
在支持朋友概念的平台上,玩家可以跟随朋友进入一个会话,或者邀请朋友加入会话。
通过调用'IOnlineSession:FindFriendSession()',将想要加入会话的本地玩家人数和已经在会话中的朋友的ID传递给它,可以跟踪一个朋友进入会话。
当找到会话时,'OnFindFriendSessionComplete'委托将被触发,它包含一个可用于加入会话的SearchResult。
玩家还可以使用'IOnlineSession::SendSessionInviteToFriend()'或'IOnlineSession::SendSessionInviteToFriends()'来邀请一个或多个朋友加入他们当前的会话,并传递被邀请的玩家的本地玩家人数、会话名称和ID。
当朋友接受邀请时,包含要加入的会话的搜索结果的“OnSessionInviteAccepted”委托将被触发。