← All projects

Unreal Engine — ATEM Control

A playable Unreal Engine level that controls real Blackmagic ATEM video switchers over WebSocket — walk up to a 3D model of a switcher, shoot the buttons, and switch live cameras.

Aug 2025
Unreal Engine C++ WebSocket ATEM Virtual Production

What It Is

A first-person Unreal Engine level with an interactive 3D ATEM switcher inside it. You walk up to the model, enter an IP address, and shoot at the program source buttons to switch cameras on the real physical hardware. Tally lights on the model update in real-time — red for program, green for preview — matching the actual state of the ATEM.

Why I Built It

I already had a working WebSocket backend for ATEM control through AV Site. The browser was one client. The native Blackmagic software was another. I wanted to see what happened when a game engine became a client too.

The interaction is deliberately playful — nobody needs to shoot at a switcher to change cameras. But the underlying technology proves something useful. Productions that already use Unreal Engine for LED walls or virtual sets could use this kind of integration for real automation. Virtual lights that dim on camera cuts, backgrounds that change based on the active input, camera switches triggered by in-engine events. The bidirectional link between a game engine and broadcast hardware opens all of that up.

How It Works

The level is built from the Unreal Engine starter template — a simple first-person environment with a custom 3D ATEM model placed in it. The model has sphere-shaped buttons for each program source with collision triggers. When the player walks close enough, a UI prompt lets them enter the ATEM’s IP address.

From there, the level connects to AV Site’s Django Channels WebSocket — the exact same endpoint the browser clients use. Unreal is just another client. Shooting a program button sends a set_program command through the WebSocket, which Django translates to a PyATEMMax call to the physical switcher. State changes flow back the other way — when someone switches a camera from the physical hardware, the browser, or anywhere else, the 3D model’s tally lights update instantly.

The C++ WebSocket integration was built in Visual Studio 2022 using Unreal’s built-in WebSocket Messaging plugin. The whole project took about a week.

Tech Stack

  • Engine: Unreal Engine 5.6, C++, Visual Studio 2022
  • Communication: WebSocket (Unreal’s WebSocket Messaging plugin)
  • Backend: Django Channels (shared with AV Site — no new backend code needed)
  • Hardware: Blackmagic ATEM switchers via PyATEMMax

Screenshots and screen recordings coming soon.

Coming soon — connecting Unreal to an existing WebSocket backend, bidirectional state sync between a game engine and broadcast hardware.

← All projects