多人游戏客户端下切换地图ServerTravel,和跨关卡传递Actor信息

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测试是否正确获取到变量。

相关网站:https://ue5wiki.com/wiki/19376/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值