蓝图实现

创建一个联机地图,我命名为 “ onlineMap01 ” ,然后在角色蓝图中创建两个按钮事件,一个用于打开地图,另一个用于加入创建的地图

OpenLevel的options中的listen是指定监听服务器,简单来说就是将当前端设为服务端

可以利用UE编辑器直接开两个标准窗口测试,或者打包到同局域网下进行测试,不过如果是不同电脑,则需要修改ip地址,一端先按1键,创建地图,并将当前端设置为监听服务器,然后通过另一端按2键加入该地图

UEC实现

创建一个联机地图,我命名为 “ onlineMap01 ” ,然后去到角色类中,创建相关函数进行开启服务和加入服务

这里有两种方式加入服务

第一种是通过OpenLevel函数利用ip加入

第二种是通过获取当前玩家的玩家控制器,在利用玩家控制器的Client Travel 函数通过ip加入

头文件,申明所需要的自定义函数

1
2
3
4
5
6
UFUNCTION(BlueprintCallable)
void OpenOnlineMap();
UFUNCTION(BlueprintCallable)
void CallOpenLevel(const FString& Adr);
UFUNCTION(BlueprintCallable)
void CallClientTravel(const FString& Adr);

源代码文件,实现函数功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 创建服务
void AOnLineTestingCharacter::OpenOnlineMap()
{
UWorld* world = GetWorld();
if (world) {
// listen 为服务监听器
world->ServerTravel("/Game/Maps/onlineMap01?listen");
}
}
// 第一种通过OpenLevel加入
void AOnLineTestingCharacter::CallOpenLevel(const FString& Adr)
{
UGameplayStatics::OpenLevel(this, *Adr);
}
// 第二种通过角色控制器加入
void AOnLineTestingCharacter::CallClientTravel(const FString& Adr)
{
APlayerController* PlayerController = GetGameInstance()->GetFirstLocalPlayerController();
if (PlayerController) {
// 通过绝对路径加入
PlayerController->ClientTravel(Adr, ETravelType::TRAVEL_Absolute);
}
}

使用同蓝图部分,利用按键事件触发写好的自定义函数,使用两种方式皆可进入,且两个函数中的 Adr 是服务端的ip地址