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//意思是可连接数,这里设置为4mySessionSettings->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//如果平台支持,是否选择大厅的APImySessionSettings->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次,第一次成功,第二次失败,第三次成功。