Skip to content

Using Device Messenger

FOperatingSystemDeviceMessengerSystem (accessed via Find Messenger from Operating System / Find Messenger for Device) scopes events to a single running device. Use it when Mail, Video Player, portable battery handlers, or your own programs need to talk inside the OS without reaching level actors.

Full reference: Device Messenger Subsystem.

flowchart TB
  subgraph row1[" "]
    direction LR
    Mail["BP_Prog_Mail"] -->|Broadcast MailReceived| DM["FOperatingSystemDeviceMessengerSystem"]
  end
  subgraph row2[" "]
    direction LR
    Taskbar["UOperatingSystemTaskbarButton"] --- Battery["Portable device battery HUD"]
  end
  DM --> Taskbar
  DM --> Battery
Device MessengerGlobal Messenger
ScopeOne device / OS instanceEntire world
IdentifiersFName event namesGameplay tags
Typical useProgram ↔ program, battery UITerminal → door, OS → gameplay
(On new mail received)
→ Find Messenger from Operating System
→ Broadcast (Event Name: "MailReceived", Payload: mail data object)
Event Construct
→ Find Messenger for Device
→ Begin Listening (Event Name: "MailReceived")
Callback → Show unread badge on taskbar button

Device messenger broadcast node

#include "Devices/OperatingSystemDeviceMessenger.h"
#include "Statics/OperatingSystemStatics.h"
void UMyMailProgram::NotifyNewMail()
{
if (auto* Messenger = UOperatingSystemStatics::FindMessengerFromOperatingSystem(GetOperatingSystem()))
{
Messenger->Broadcast(FName("MailReceived"), this);
}
}
UFUNCTION()
void UMyTaskbarWidget::OnMailReceived(UObject* Payload);
void UMyTaskbarWidget::NativeConstruct()
{
Super::NativeConstruct();
if (auto* Messenger = UOperatingSystemStatics::FindMessengerFromOperatingSystem(OS))
{
FOperatingSystemDeviceMessageDelegate Delegate;
Delegate.BindDynamic(this, &UMyTaskbarWidget::OnMailReceived);
Messenger->BeginListening(FName("MailReceived"), Delegate);
}
}

Study plugin implementations: