UE4/5多人游戏详解(三、创建会话,委托绑定回调函数)

目录

基础的创建

回调函数绑定到委托:

实现创建会话的函数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次,第一次成功,第二次失败,第三次成功。 

猜你喜欢

转载自blog.csdn.net/q244645787/article/details/130142443