目录
基础的创建
回调函数绑定到委托:
实现创建会话的函数createGameSession:
回调函数实现判断验证是否成功:
添加会话设置:
测试
基础的创建
[提示:中途如果有无法编译则删除Binaries,saved,Intermediate后重新加载编译,如果仍然错误,就可能是你写错了]
我们使用 创建会话后,Session Interface将会发送信息到Steam,Steam将会创建游戏会话,之后Steam将会把信息发送回来,以便让我们知道创建会话的操作已经完成。
会话接口使用委托来做到这一点,会话接口定义了一组委托。
之前我讲过这个#include "Interfaces/OnlineSessionInterface.h"的头文件可以放在第三人称的头文件之中:
所以这里我就将其放在头文件,不过在角色的头文件中,这个地方就需要更改为这个:
做一个函数用来创建会话:
创建委托:
委托创建之后,我们要创建一个回调函数,这个回调函数将会在成功创建会话后调用,所以要绑定委托,广播信号触发时,每一个绑定在委托上的函数都将被触发。
网络会话使用了委托机制,创建和连接游戏需要发送信息。
也因此我们可以看看委托里面需要调用的传输:
因此我们创建的回调函数是这样的:
回调函数绑定到委托:
然后我们到构造函数中去进行初始化,将回调函数绑定到委托,这是虚幻的一种绑定方式:
实现创建会话的函数createGameSession:
第一步是检查和确保在线的会话是否有效:
在之后我们要添加#include "OnlineSessionSettings.h"的头文件:
然后:
回调函数实现判断验证是否成功:
添加会话设置:
代码:
void AMorePersonTestCharacter::createGameSession()
{
//当按下1的时候使用
//第一步:检查确保在线的会话是有效的:
//判断当前的myOnlineSessionInterface是否无效
if (!myOnlineSessionInterface.IsValid())
{
return;
}
//NAME_GameSession是一个全局变量,这里返回的是一个FName,将其赋予局部变量NowSession存储
auto NowSession = myOnlineSessionInterface->GetNamedSession(NAME_GameSession);
//判断是不是空指针,不是的话将这个会话销毁掉
if (NowSession !=nullptr)
{
myOnlineSessionInterface->DestroySession(NAME_GameSession);
}
//第二步:
//将myOnlineSessionInterface加入委托列表
myOnlineSessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate);
//TSharedPtr是非UObject的智能指针
TSharedPtr<FOnlineSessionSettings> mySessionSettings = MakeShareable(new FOnlineSessionSettings());
//bIsLANMatch:This game will be lan only and not be visible to external players1
//意思是这个是局域网连接,外面看不见,所以这里用false;【因为我们想要互联网连接】
mySessionSettings->bIsLANMatch=false;
//NumPublicConnections :The number of publicly available connections advertised
//意思是可连接数,这里设置为4
mySessionSettings->NumPublicConnections = 4;
//bAllowJoinInProgress : Whether joining in progress is allowed or not
//意思是会话正在进行,允不允许玩家加入
mySessionSettings->bAllowJoinInProgress = true;
//bAllowJoinViaPresence :Whether joining via player presence is allowed or not
//steam有一个叫状态的东西,这个打开是为了让我们的连接正常工作
mySessionSettings->bAllowJoinViaPresence = true;
//bShouldAdvertise :Whether this match is publicly advertised on the online service
//该匹配是否在在线服务上公开宣传[让其他玩家找到这个会话]
mySessionSettings->bShouldAdvertise = true;
//bUsesPresence :Whether to display user presence information or not
//显示用户状态,查找所在区域正在进行的会话
mySessionSettings->bUsesPresence = true;
//bUseLobbiesIfAvailable :Whether to prefer lobbies APls if the platform supports them
//如果平台支持,是否选择大厅的API
mySessionSettings->bUseLobbiesIfAvailable = true;
//创建指向本地玩家的指针
const ULocalPlayer* localPlayer = GetWorld()->GetFirstLocalPlayerFromController();
//查看函数实现:创建会话需要的是一个网络ID(里面底层原因,所以加一个*),会话名字,在线会话设置对象(这里传入的不是指针,所以加一个*)
myOnlineSessionInterface->CreateSession(*localPlayer->GetPreferredUniqueNetId(), NAME_GameSession, *mySessionSettings);
}
void AMorePersonTestCharacter::finishSessionCreate(FName sessionName, bool createSessionSuccessed)
{
//判断是否创建成功
if (createSessionSuccessed)
{
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Blue, FString::Printf(TEXT("Create Session Successed:%s"), *sessionName.ToString()));
}
}
else//没有成功
{
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Red, FString(TEXT("Create Session Failed")));
}
}
}
测试
在蓝图中,用1键盘进行验证:
然后打包【记得打开steam】:
我按了3次,第一次成功,第二次失败,第三次成功。