UE4/5多人游戏详解(四、加入游戏会话,数值key和value,寻找IP地址)
目录
加入游戏会话
找到会话
加入会话
代码:
设置会话key和value
代码:
在寻找会话中添加匹配:
代码:
寻找IP地址:
代码:
代码:
测试:
目录
加入游戏会话
找到会话
加入会话
编辑
代码:
设置会话key和value
代码:
在寻找会话中添加匹配:
编辑代码:
寻找IP地址:
代码:
回调函数onJoinSessionComplete实现:
代码:
测试:
加入游戏会话
找到会话
做一个函数,这个函数是用来让玩家加入游戏会话的。
一样是在角色的.h文件里面创建:
和之前一样,将回调函数和委托进行绑定
然后:
开始实现做的函数和回调函数
函数joinGameSession:
然后是回调函数:
这里我们测试可不可以找到我们:
看来是可以的。
加入会话
第一步是创建一个大厅的地图:
创建之后,我们进入cpp文件:
找到创建会话时候调用的回调函数这里:
现在只是判断我们是否创建成功后打印,我们要在找到创建成功之后,进入这个Lobby的等待大厅,所以:
代码:
//创建指针获取现在所在的世界UWorld* myWorld = GetWorld();if (myWorld)//判断其有效性{//这里Content替换为Game,之前讲过,这是十分值得注意的地方(这里可以不用.umap,因为系统已经知道了)//最后这里添加 ?listen 这样是让玩家进入大厅之后,打开大厅这个监听服务器myWorld->ServerTravel(FString("/Game/Map/Lobby?listen"));}
设置会话key和value
现在来到创建函数的地方
现在我们要在这里面进行一些设置
可以看见要输入的是一个Key和一个Value,所以我们可以进去看看,我们可以输入的value是什么类型的:
在知道了可以输入什么类型之后,我们可以开始写了:
代码:
//这一行代码的目的是将在线游戏会话的匹配类型设置为自由对战,并广告发送到在线服务和Ping以使其他玩家可以找到和加入该会话。mySessionSettings->Set(FName("MatchType"),FString("FreeForAll"),EOnlineDataAdvertisementType::ViaOnlineServiceAndPing);
在寻找会话中添加匹配:
找到寻找函数的回调函数:
找到之后,我们可以看见在这里我已经找到了id和使用者名字
接下来我们就需要在这里添加一个:
然后在下面这里判断是否匹配
代码:
void AMorePersonTestCharacter::onFindSessionComplete(bool findSeesionYorN)
{//寻找会话//遍历myOnlineSessionSearch里面存储的会话数组for (auto Result : myOnlineSessionSearch->SearchResults){FString id = Result.GetSessionIdStr();FString UserName = Result.Session.OwningUserName;//创建MatchTypeValue,这个将用来接受获取的value值FString MatchTypeValue;//这里找到key值后,将其value值放入MatchTypeValue里面Result.Session.SessionSettings.Get(FName("MatchType"), MatchTypeValue);//这里判断value值是否匹配if (MatchTypeValue ==FString("FreeForAll")){//打印放到这里面if (GEngine){GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Green,FString::Printf(TEXT("MatchTypeValue:%s"),*MatchTypeValue));}}}
}
寻找IP地址:
创建函数和委托:
首先第一步是一样的在构造函数中绑定委托:
然后我们找到寻找的回调函数,添加:
代码:
void AMorePersonTestCharacter::onFindSessionComplete(bool findSeesionYorN)
{//判断接口是否有效if (!myOnlineSessionInterface.IsValid()){return;}//寻找会话//遍历myOnlineSessionSearch里面存储的会话数组for (auto Result : myOnlineSessionSearch->SearchResults){FString id = Result.GetSessionIdStr();FString UserName = Result.Session.OwningUserName;//创建MatchTypeValue,这个将用来接受获取的value值FString MatchTypeValue;//这里找到key值后,将其value值放入MatchTypeValue里面Result.Session.SessionSettings.Get(FName("MatchType"), MatchTypeValue);//这里判断value值是否匹配if (MatchTypeValue ==FString("FreeForAll")){//打印放到这里面if (GEngine){GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Green,FString::Printf(TEXT("MatchTypeValue:%s"),*MatchTypeValue));}}//将回调函数加入委托myOnlineSessionInterface->AddOnJoinSessionCompleteDelegate_Handle(JoinSessionCompleteDelegate);//获取本地玩家控制器指针const ULocalPlayer* localPlayer = GetWorld()->GetFirstLocalPlayerFromController();//调用加入会话-->结束后调用回调函数myOnlineSessionInterface->JoinSession(*localPlayer->GetPreferredUniqueNetId(), NAME_GameSession, Result);}
}
回调函数onJoinSessionComplete实现:
代码:
void AMorePersonTestCharacter::onJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result)
{//判断是否有效if (!myOnlineSessionInterface.IsValid()){return;} //根据会话名字,获取ip地址到IPAddressFString IPAddress;if (myOnlineSessionInterface->GetResolvedConnectString(NAME_GameSession, IPAddress)){ //打印if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Yellow, FString::Printf(TEXT("Connect String:%s"), *IPAddress)); }//从游戏实例里面获取第一个玩家控制器APlayerController* myPlayerController = GetGameInstance()->GetFirstLocalPlayerController();if (myPlayerController){//根据地址,进入游戏myPlayerController->ClientTravel(IPAddress,ETravelType::TRAVEL_Absolute);}}
}
测试:
毫无疑问是成功了: