1. 程式人生 > >[UE4]自定義伺服器

[UE4]自定義伺服器

UE4 dedicated server是一個很好的遊戲伺服器,但是對於大廳和聊天伺服器來說,我們要自行開發,通過UE4的socket組建很方便的和其他伺服器建立連線

建立Socket

FSocket* Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false);

CreateSocket引數

  1. 型別
  2. 描述
  3. 是否強制UDP

設定地址

FString address = TEXT("127.0.0.1");
int32 port = 19834;
FIPv4Address ip;
FIPv4Address::Parse(address, ip);
TSharedRef addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr(); addr->SetIp(ip.GetValue()); addr->SetPort(port);

連線伺服器

bool connected = Socket->Connect(*addr);

如果返回True說明連線伺服器成功.

傳送訊息


FString serialized = TEXT("loadPlayer|1");
TCHAR *serializedChar = serialized.GetCharArray().GetData();
int32 size = FCString::Strlen(serializedChar);
int32 sent = 0;

傳送內容FString轉換成TCHAR*,格式化傳送資料

bool successful = Socket->Send((uint8*)TCHAR_TO_UTF8(serializedChar), size, sent);

接受資料我們用到 HasPendingData 和Recv 函式在 FSocket 類中.

在工程中引用Sockets模組

PublicDependencyModuleNames.AddRange(
   new string[]
   {
      "Core",
      "CoreUObject",
      "Engine",
      "Sockets"
   }
);

UE4 架構在構建時就充分考慮了多人遊戲因素。只要您遵守基本的架構原則,通常就無需太費事即可將單人遊戲體驗擴充套件為多人遊戲。

UE4 網路連線是基於伺服器/客戶端模式構建。也就是說,這個模式中有一個擔當主控(authoritative)的伺服器端(做出所有重要決定),用於確保所有連線的客戶端可以持續更新,以便其持續獲得伺服器環境的最新近似複本。

Actor

在單人遊戲體驗中,actor 被用於呈現遊戲世界。而在多人遊戲中,這一點絲毫沒有變化,只不過客戶端將獲得每個 actor 的近似複本,而伺服器將保持主控(authoritative)版本。

Actor 是伺服器讓客戶端保持最新的主要途徑。當伺服器需要更新特定的客戶端時,伺服器將收集所有的相關 actor(也就是其認定在上次更新後發生變化的 actor),然後向客戶端傳送足夠的資訊,以便讓這些 actor 保持最新狀態。

啟動伺服器

監聽伺服器

UE4Editor.exe ProjectName MapName?Listen -game

專用伺服器

UE4Editor.exe ProjectName MapName -server -game -log

客戶端

UE4Editor.exe ProjectName ServerIP -game

連線過程

主要步驟如下:

  1. 客戶端傳送連線請求。

  2. 如果伺服器接受連線,則傳送當前地圖。

  3. 伺服器等待客戶端載入此地圖。

  4. 載入之後,伺服器將在本地呼叫 AGameMode::PreLogin。

    • 這樣可以使 GameMode 有機會拒絕連線

  5. 如果接受連線,伺服器將呼叫 AGameMode::Login

    • 該函式的作用是建立一個 PlayerController,可用於在今後複製到新連線的客戶端。成功接收後,這個 PlayerController 將替代客戶端的臨時 PlayerController (之前被用作連線過程中的佔位符)。

    • 此時將呼叫 APlayerController::BeginPlay。應當注意的是,在此 actor 上呼叫 RPC 函式尚存在安全風險。您應當等待 AGameMode::PostLogin 被呼叫完成。

  6. 如果一切順利,AGameMode::PostLogin 將被呼叫。

    • 這時,可以放心的讓伺服器在此 PlayerController 上開始呼叫 RPC 函式。