[UE4]自定義伺服器
UE4 dedicated server是一個很好的遊戲伺服器,但是對於大廳和聊天伺服器來說,我們要自行開發,通過UE4的socket組建很方便的和其他伺服器建立連線
建立Socket
FSocket* Socket = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false);
CreateSocket引數
- 型別
- 描述
- 是否強制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
連線過程
主要步驟如下:
-
客戶端傳送連線請求。
-
如果伺服器接受連線,則傳送當前地圖。
-
伺服器等待客戶端載入此地圖。
-
載入之後,伺服器將在本地呼叫 AGameMode::PreLogin。
-
這樣可以使 GameMode 有機會拒絕連線
-
-
如果接受連線,伺服器將呼叫 AGameMode::Login
-
該函式的作用是建立一個 PlayerController,可用於在今後複製到新連線的客戶端。成功接收後,這個 PlayerController 將替代客戶端的臨時 PlayerController (之前被用作連線過程中的佔位符)。
-
此時將呼叫 APlayerController::BeginPlay。應當注意的是,在此 actor 上呼叫 RPC 函式尚存在安全風險。您應當等待 AGameMode::PostLogin 被呼叫完成。
-
-
如果一切順利,AGameMode::PostLogin 將被呼叫。
-
這時,可以放心的讓伺服器在此 PlayerController 上開始呼叫 RPC 函式。
-