ScarChat
Multiplayer text chat system.
A fully replicated, real-time text chat system built in Unreal Engine with Blueprints only. Server-authoritative message handling, client-side UI updates and modular widgets that work with EOS, Steam, dedicated servers and LAN. No plugins and no C++, just clean Blueprints.
- Engine support
- Unreal Engine 5
- Version
- 1.0
- Backends
- Steam, EOS, Dedicated Servers, LAN, Listen Servers
What you get
- Server-authoritative message handling
- Client-side UI updates
- Modular widgets you can restyle
- Copy-paste-friendly PlayerController logic
- No plugins and no C++, just clean Blueprints
System overview
ScarChat is split into three layers.
| Layer | What it does |
|---|---|
| UI Widgets | Display messages, input text, and animate the chat box. |
| Player Controller | Sends and receives messages. |
| Server Logic | Distributes chat messages to all players. |
The flow
Player types -> Client sends to Server -> Server sends to all Players -> Each client updates UIThis keeps the system secure, lag-free, and compatible with all multiplayer backends.
UI widgets
There are two widgets.
WBP_ChatPannel
This is the main chat UI. It contains:
- Border, the chat box background
- ScrollBox (ChatScroll), holds all messages
- Vertical Box, inside the scroll box, where messages are added
- Editable Text Box (ChatInput), where the player types
- Button (Hide/Unhide), toggles chat visibility
- Animation (Hide_UnhideChatBox), the slide in and out effect
This widget is created once per player on BeginPlay.
WBP_ChatMessage
This is one single chat line. It contains:
- Horizontal Box
- Text: PlayerName
- Text: the colon separator
- Text: ChatMessage
This widget is spawned every time someone sends a message.
Widget logic
Chat message widget (WBP_ChatMessage)
On Event Construct:
- SetText(PlayerName)
- SetText(ChatMessage)
This means every message widget is self-contained and clean.
Chat panel widget (WBP_ChatPannel)
When a new message arrives:
- 01Create WBP_ChatMessage.
- 02Set Player Name (Device Name).
- 03Set Chat Message.
- 04Add it to the Vertical Box.
- 05Scroll to the bottom.
That is what the UpdateChat event does.
Sending messages (client side)
Inside WBP_ChatPannel, the ChatInput uses the OnTextCommitted event, which triggers when the player presses Enter.
- 01Check if the commit method is Enter.
- 02Get Owning Player.
- 03Cast to your BP_Chat_PlayerController.
- 04Get Player Name from PlayerState.
- 05Call Server_SubmitChat(PlayerName, Message).
- 06Clear the input box.
The client never talks to other clients. It only talks to the server.
Server side logic
In the PlayerController, Server_SubmitChat runs on the server. It does the following:
- 01Gets GameState, then PlayerArray.
- 02Loops through all players.
- 03For each player, gets their PlayerController and calls Client_UpdateChat(PlayerName, Message).
This guarantees every player receives the message.
Client side receive
Client_UpdateChat runs on each client. This event:
- 01Gets WBP_ChatPannelRef.
- 02Calls UpdateChat.
- 03Passes Player Name and Message.
- 04The widget creates the UI.
That is why messages instantly appear on every screen.
Chat box animation
The Hide and Unhide system runs Button, then FlipFlop, then Play Animation.
- A plays the animation in reverse
- B plays the animation forward
This lets players focus on gameplay without losing the chat.
Auto UI setup
On PlayerController BeginPlay:
- 01Check Is Local Player Controller.
- 02Create WBP_ChatPannel. You can call the widget anywhere else as well.
- 03Save the reference.
- 04Add to Viewport.
So every player automatically gets a chat UI.
Why this system works everywhere
Because it:
- Uses PlayerController replication
- Uses the GameState PlayerArray
- Never uses session-specific APIs
That is why it works with:
- EOS
- Steam
- Dedicated Servers
- LAN
- Listen Servers
No changes needed between backends.
How developers use it
- 01Copy the PlayerController Blueprint logic and paste it into your player controller.
- 02Assign WBP_ChatPannel.
- 03Drop it into your project.
No re-wiring required.
Stuck on something?
We answer every serious message ourselves. Discord is the fastest way to get an answer from the person who built the plugin.