Powrót do Bloga

Zapomnij o HTTP Polling: Tutorial WebSockets w Unreal Engine dla Backendów Real-Time

Opublikowano 22 lutego 2026
Zapomnij o HTTP Polling: Tutorial WebSockets w Unreal Engine dla Backendów Real-Time

Każdy deweloper gier Multiplayer prędzej czy później trafia na ścianę, gdzie standardowa replikacja w Unreal Engine przestaje wystarczać. Niezależnie od tego, czy potrzebujesz globalnego czatu, kolejki Matchmakingu czy systemu handlu w czasie rzeczywistym, użycie HTTP pollingu doprowadzi do przeciążenia Game Threadu i zasypania serwera zbędnymi zapytaniami.

HTTP stworzono do bezstanowego pobierania dokumentów, a nie danych gier w czasie rzeczywistym. Odpytywanie serwera co 500ms generuje ogromny overhead. Sam handshake HTTP marnuje cenne milisekundy, a przy 10 000 graczy Twoja infrastruktura Backendowa po prostu padnie.

Rozwiązaniem są WebSockets. WebSocket zapewnia trwały, dwukierunkowy kanał komunikacji przez jedno połączenie TCP. Po nawiązaniu połączenia, klient i serwer mogą przesyłać dane natychmiastowo z latencją poniżej 50ms.

W tym tutorialu WebSockets dla Unreal Engine zaimplementujemy wbudowany moduł w C++, bezpiecznie obsłużymy wątki, zserializujemy JSON i połączymy się z serwerem Backendowym bez crashowania gry.

Dlaczego standardowa replikacja nie zastąpi WebSockets

Architektura sieciowa Unreal Engine jest zaprojektowana do komunikacji klient-serwer dedykowany przez UDP. Ale co, gdy gracz w Meczu A musi wysłać wiadomość do gracza w Meczu B? Albo gdy chcesz połączyć klienta z globalnym Backendem obsługującym progresję lub ekonomię? Standardowe RPC nie komunikują się z endpointami webowymi. Potrzebujesz zewnętrznej warstwy komunikacji, o czym piszemy w Beyond The Pixels Why Your Games Backend Is The Secret To Long Term Success.

Krok 1: Włączenie modułów

W pliku YourProjectName.Build.cs dodaj WebSockets oraz Json do publicznych zależności.

PublicDependencyModuleNames.AddRange(new string[] { 
    "Core", "CoreUObject", "Engine", "InputCore", "WebSockets", "Json", "JsonUtilities"
});

Krok 2: Header komponentu

Użyjemy UActorComponent. Dołącz IWebSocket.h i zdefiniuj delegaty.

// TSharedPtr zarządza cyklem życia połączenia
TSharedPtr<IWebSocket> WebSocket;

Krok 3: Logika połączenia

Kluczowe jest podpięcie callbacków przed wywołaniem Connect().

WebSocket = FWebSocketsModule::Get().CreateWebSocket(ServerURL, TEXT("wss"));

Krok 4: Pułapka Game Threadu

Callbacki IWebSocket wykonują się w wątku tła. Próba modyfikacji UI lub Aktora z tego poziomu spowoduje crash. Użyj AsyncTask, aby wrócić do Game Threadu.

AsyncTask(ENamedThreads::GameThread, [this, Message]() {
    OnMessageReceived.Broadcast(Message);
});

Backend: Prawdziwe wyzwanie

Budowa serwera WebSocket gotowego na produkcję wymaga obsługi Sticky Sessions, Redis Pub/Sub i certyfikatów SSL. Dzięki horizOn te usługi Backendowe są gotowe i skalowalne od razu.

Best Practices

  1. Exponential Backoff: Nie atakuj własnego serwera ciągłymi próbami połączenia.
  2. WSS na produkcji: Nigdy nie używaj nieszyfrowanego ws://.
  3. Małe Payloady: Używaj JSONa lub danych binarnych.
  4. Heartbeats: Implementuj Ping/Pong, by wykrywać zerwane połączenia.
  5. Walidacja po stronie serwera: Nigdy nie ufaj klientowi; sprawdzaj wszystko na Backendzie.

Gotowy na wyższy poziom Multiplayer? Wypróbuj horizOn za darmo lub sprawdź dokumentację API.