Unreal Text Chat

In Example Plugin, we have a simple example chat system that can be used for small/medium sized experiences. It doesn't use an external web service (e.g. PubNub), instead handling the messaging through the Unreal machines, via Morpheus networking.

The main classes

The singleton (BPM_M2Example_TextChatSingleton)

This is the morpheus actor that handles the networking involved in sending these Unreal text chat messages. Clients call SendChatMessage, which sends an RPC to the server. The server then reviews the message, and broadcasts it to the clients via a multicast RPC.

A note on moderation

We add a ProcessMessage step at the point of receiving a Server_SendChatMessage RPC, which acts as an entry point for adding moderation/chat filtering. The example is just a simple check that rejects messages that are too long, but more complex moderation could be added here, such as rejecting certain words, or interacting with an external service like CommunitySift.

(Note that adding complex logic to this ProcessMessage method may slow the server down at scale, since the computation is being run on the server for each message that gets processed in this example)

Rate Limiting

If you look at BPMC_M2Example_TextChatComponent you will find an example of how we rate limit on clients. The intent here is to limit the number of messages processed by the server to reduce impact on performance. Rate limiting here scales so that as the user count increases, a delay is added to the message being sent making it harder for a single user to spam the server's Text Chat Singleton. Default values will add up to 1 second of delay per 1000 users in the experience.

Change variable Rate Limit Length Per Divisor to alter max delay that can be applied per user increment.

Change variable Rate Limit Player Divisor to alter the threshold at which delay is increased.

Client-side rate limiting as seen in BPMC_M2Example_TextChatComponent

Additionally, we have functionality on BPM_M2Example_TextChatSingleton which also rate limits messages sent to clients, reducing the amount of widgets added per tick.

Server-side rate limiting as seen in BPM_M2Example_TextChatSingleton

The text chat component (BPMC_M2Example_TextChatComponent)

This component is added to the character's MorpheusActor, and is responsible for communicating with the singleton, sending messages through it, and listening to messages received by it.

The UI (WBP_M2Example_TextChat)

This is the widget added to the example HUD that listens to the text chat component, adding any received messages to the "message history", and sending any messages typed in to the input box (WBP_M2Example_TextChatInputField).

WBP_M2Example_TextChatMessage and WBP_M2Example_TextChatInputField have some added logic to handle adding emojisto the messages.

A note on performance

Adding widgets is a nontrivial operation for the client, so adding a large number of messages in a single tick is going to slow down the client. In this example we have mitigated this with the rate limiting done by the singleton, limiting it so that just a few messages are received per tick.

Last updated

Was this helpful?