目录
目录
加入游戏会话
找到会话
做一个函数,这个函数是用来让玩家加入游戏会话的。
一样是在角色的.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);
}
}
}
测试:
毫无疑问是成功了: