UE4/5多人游戏详解(四、加入游戏会话,数值key和value,寻找IP地址)

目录

加入游戏会话

找到会话

加入会话

代码:

设置会话key和value

代码:

在寻找会话中添加匹配:

代码:

寻找IP地址:

扫描二维码关注公众号,回复: 15228253 查看本文章

代码:

 回调函数onJoinSessionComplete实现:

代码:

 测试:


目录

加入游戏会话

找到会话

加入会话

​编辑

代码:

设置会话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地址到IPAddress
	FString 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);
		}
	}
}

 测试:

毫无疑问是成功了:

猜你喜欢

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