ServerTravel作用:用于多人联机游戏的关卡切换。服务器切换地图时,客户端也随之进入新地图。
RoomGameModeBase.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "RoomGameModeBase.generated.h"
/**
*
*/
UCLASS()
class TESTLISTENSERVER_API ARoomGameModeBase : public AGameModeBase
{
GENERATED_BODY()
ARoomGameModeBase();
virtual void BeginPlay() override;
virtual void GetSeamlessTravelActorList(bool bToTransition, TArray<AActor*>& ActorList) override;
public:
//要传递的信息actor类
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TSubclassOf<AActor> InfoClass;
//要传递的信息actor实例
UPROPERTY(BlueprintReadOnly)
AActor* InfoActor;
//目前测试效果和命令行输入servertravel+地图名一样
/*UFUNCTION(BlueprintCallable, Category = "Gameplay|Room")
void TryServerTravel(const FString& URL, bool bAbsolute = false);*/
};
RoomGameModeBase.cpp
#include "RoomGameModeBase.h"
#include "Kismet/KismetSystemLibrary.h"
ARoomGameModeBase::ARoomGameModeBase()
{
//设置无缝旅行(测试结果显示无缝旅行设置为true后,servertravel后actor才能跨关卡传递)
bUseSeamlessTravel = true;
}
void ARoomGameModeBase::BeginPlay()
{
//根据蓝图配置的类型生成InfoActor
InfoActor = GetWorld()->SpawnActor<AActor>(InfoClass, FVector::ZeroVector, FRotator::ZeroRotator);
//允许PIE无缝旅行(编辑器有这个命令才能跨关卡传递actor,servertravel后actor才能获取得到)
#if WITH_EDITOR
UKismetSystemLibrary::ExecuteConsoleCommand(this, TEXT("net.AllowPIESeamlessTravel 1"));
#endif
Super::BeginPlay();
}
void ARoomGameModeBase::GetSeamlessTravelActorList(bool bToTransition, TArray<AActor*>& ActorList)
{
Super::GetSeamlessTravelActorList(bToTransition, ActorList);
//往ActorList里添加InfoActor
if (InfoActor)
{
ActorList.Add(InfoActor);
}
}
//void ARoomGameModeBase::TryServerTravel(const FString& URL, bool bAbsolute)
//{
// ProcessServerTravel(URL, bAbsolute);
// UE_LOG(LogTemp, Display, TEXT("Server Travel:%s"), *URL);
//}
UMyBlueprintFunctionLibrary.h
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"
UCLASS()
class TESTLISTENSERVER_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
// 获取本地IP和端口
UFUNCTION(BlueprintPure, meta = (WorldContext = "WorldContextObject"), Category = "BPFL")
static void GetLocalIPAndPort(UObject* WorldContextObject, FString& OutIPAddress, int32& OutPort);
};
UMyBlueprintFunctionLibrary.cpp
#include "MyBlueprintFunctionLibrary.h"
#include "Kismet/KismetSystemLibrary.h"
#include "SocketSubsystem.h"
#include "Kismet/GameplayStatics.h"
#include "Sockets.h"
#include "IPAddress.h"
void UMyBlueprintFunctionLibrary::GetLocalIPAndPort(UObject* WorldContextObject, FString& OutIPAddress, int32& OutPort)
{
OutPort = 0;
OutIPAddress = TEXT("0.0.0.0");
if (WorldContextObject)
{
if (UWorld* World = WorldContextObject->GetWorld())
{
OutPort = World->URL.Port;
}
}
bool canBind = false;
TSharedRef<FInternetAddr> localIp = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->GetLocalHostAddr(*GLog, canBind);
OutIPAddress = (localIp->IsValid() ? localIp->ToString(false) : "");
}
测试用方法
总的来说,测试方法就是单机运行开2个端口,1号端按1开监听服务器,2号端按2加入服务器,然后随便哪个端按5设置变量。接着作为服务器的端口(1号端)按3进行servertravel到新关卡,2号端作为客户端会跟随进入新关卡,再然后按6测试是否正确获取到变量。