Zurück zum Blog

Das 32-Zeichen-Limit für UEFN Analytics Device Event Names knacken (Verse Tutorial)

Veröffentlicht am 12. März 2026
Das 32-Zeichen-Limit für UEFN Analytics Device Event Names knacken (Verse Tutorial)

Jeder technische Game Developer kennt den Moment, in dem die Telemetry-Pipeline zusammenbricht: Wenn man einen komplexen Player State tracken muss, die Engine aber die Datenmenge begrenzt. Wer im Unreal Editor for Fortnite arbeitet, ist wahrscheinlich schon frontal gegen das UEFN Analytics Device Event Name Limit gestoßen.

Da das native analytics_device keine beliebigen Argumente oder JSON-Payloads unterstützt, müssen Entwickler kreativ werden. Oft endet das in unleserlichen Strings wie Player_Left_During_G1_F_Active_M, nur um einen einfachen Analytics-Funnel zu bauen.

Aber es gibt einen harten Stopp: Der Event Name darf 32 Zeichen nicht überschreiten.

Sobald man einen Waffentyp, eine Zone oder einen Match-Timestamp hinzufügen möchte, lehnt das Device den String ab. Die Data Funnels brechen, das Spielerverhalten bleibt ein Rätsel und die Live-Ops-Strategie scheitert, bevor sie begonnen hat.

In diesem Tutorial entwerfen wir ein robustes Telemetry-Encoding-System mit Verse. Wir zeigen, wie man komplexe Game States systematisch in Strings unter 32 Zeichen komprimiert, Analytics-Aufrufe zentralisiert und diese Strings im Backend dekodiert.

Die Anatomie eines Telemetry-Bottlenecks

Um dieses Limit zu umgehen, müssen wir verstehen, warum es existiert. Standard-Analytics-Plattformen wie Mixpanel, Amplitude oder Custom Backends behandeln Events als strukturierte Objekte. Ein Standard-Telemetry-Payload sieht normalerweise so aus:

{
  "event_name": "player_quit",
  "properties": {
    "game_phase": 1,
    "active_flag": "F",
    "player_class": "Medic",
    "time_alive_seconds": 145
  }
}

Dieses JSON-Objekt ist gut lesbar. Die Sandbox-Umgebung von UEFN begrenzt jedoch ausgehende Daten strikt, um Database Bloat auf den Epic-Servern zu vermeiden und Paketgrößen während des Gameplays zu optimieren.

Statt eines JSON-Objekts zwingt UEFN dazu, den gesamten Telemetry-Status in einen Primary Key zu pressen: den EventName. Bei nur 32 Zeichen (effektiv 32 Byte ASCII) zählt jedes Zeichen.

Der naive Ansatz ist, beschreibende Strings zu schreiben, bis das Limit erreicht ist. Der professionelle Ansatz ist ein schema-driven Telemetry Encoder.

Schritt 1: Architektur eines Telemetry Encoders in Verse

Statt mehrere Analytics Devices auf der Map zu verteilen, steuern wir alles über ein zentrales Verse-Script. Dieses fungiert als Middleware, fängt den Game State ab, komprimiert ihn nach einem Schema und übergibt ihn an das Device.

Zuerst definieren wir Shorthand-Codes: PQ für "Player_Quit", M für "Medic", S für "Sniper". So packen wir enorme Datenmengen in winzige Strings.

So bauen wir die Encoder-Klasse in Verse:

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

# Ein zentraler Manager für Analytics Payloads
telemetry_manager := class(creative_device):

    @editable
    AnalyticsDevice : analytics_device = analytics_device{}

    # Dictionary Mapping für Player Classes
    GetClassCode(ClassName: string): string=
        if (ClassName = "Medic"):
            return "M"
        if (ClassName = "Sniper"):
            return "S"
        if (ClassName = "Assault"):
            return "A"
        return "U" # Unknown

    # Komprimiert den Game State in einen schema-basierten String
    LogGameState(EventType: string, ClassName: string, ZoneID: int, TimeAlive: int): void=
        
        # Integer in Strings umwandeln
        ZoneStr := ToString(ZoneID)
        TimeStr := ToString(TimeAlive)
        
        # Komprimierten Class Code abrufen
        ClassCode := GetClassCode(ClassName)

        # Payload mit Delimiter-Schema erstellen
        # Format: E:Type|C:Code|Z:ID|T:Time
        # Beispiel: "E:PQ|C:M|Z:12|T:145"
        Payload := "E:{EventType}|C:{ClassCode}|Z:{ZoneStr}|T:{TimeStr}"
        
        # Check gegen das 32-Zeichen-Limit
        if (Payload.Length <= 32):
            AnalyticsDevice.RecordEvent(Payload)
            Print("Telemetry Logged: {Payload}")
        else:
            Print("CRITICAL: Telemetry payload exceeded 32 chars: {Payload}")

Warum diese Architektur funktioniert

Mit einem Schema wie E:PQ|C:M|Z:12|T:145 haben wir vier Variablen in nur 20 Zeichen kodiert. Es bleiben 12 Zeichen für weitere Metriken wie Weapon Loadout oder Match ID.

Schritt 2: Advanced Bit-Packing für High-Density Data

Wenn man X/Y-Koordinaten tracken will, um zu sehen, wo Spieler sterben, sprengt das Standard-Encoding sofort das Limit. Eine Koordinate wie -14502, 23049 verbraucht 13 Zeichen. Wenn Sie lernen wollen, How To Fix Player Location Desync In Uefn And Unreal Engine Multiplayer, brauchen Sie präzise Daten.

Die Lösung ist Spatial Hashing oder ein Grid-basiertes System. Teilen Sie die Map in ein Grid auf (z.B. 100x100 Zellen) und weisen Sie jeder Zelle eine 4-stellige ID zu (z.B. A01).

    # Konvertiert X/Y in eine 3-Zeichen Grid ID
    GetGridID(X: float, Y: float): string=
        GridX := Floor(X / 1000.0)
        GridY := Floor(Y / 1000.0)
        return "X{ToString(GridX)}Y{ToString(GridY)}"

Schritt 3: Dekodierung der Telemetry im Backend

Im Epic Creator Portal exportieren Sie die Daten als CSV. Die Spalte EventName enthält dann Strings wie E:PQ|C:M|Z:12|T:145. Zur Analyse nutzen wir ein Python-Script mit Pandas.

import pandas as pd
import re

def decode_uefn_telemetry(csv_path, output_path):
    df = pd.read_csv(csv_path)
    # ... (Regex Logik zum Parsen des Schemas E:Type|C:Code|Z:ID|T:Time)
    # ...
    df.to_csv(output_path, index=False)

Wann man die Sandbox verlassen sollte

Wenn Sie Wochen mit Custom String Compressors verbringen, kämpfen Sie gegen die Engine. Beim Wechsel von UEFN zu Standard Unreal Engine 5 verschwinden diese Limits. Dort nutzen Sie das HttpModule oder WebSockets für JSON. Mehr dazu in unserem Guide Ditch Http Polling An Unreal Engine Websockets Tutorial For Real Time Backends.

Mit horizOn sind diese Backend-Services vorkonfiguriert. Sie senden JSON per API und visualisieren Funnels sofort, ohne Python-Regex.

5 Best Practices

  1. Standardize Your Delimiters: Nutzen Sie ein Zeichen wie | konsequent.
  2. Never Track Continuous Data: Tracken Sie nicht pro Tick, sondern bei State Changes.
  3. Schema-Dokumentation: Halten Sie Shortcodes in einem Spreadsheet fest.
  4. Trennung: Trennen Sie technische Telemetry von Business Analytics.
  5. Validierung: Prüfen Sie die Länge in Verse vor dem Senden.

Fazit

Das UEFN Analytics Limit erfordert Disziplin. Mit einem Verse-Encoder und Backend-Decoder tracken Sie komplexe Daten trotz 32-Zeichen-Limit. Wenn Sie skalieren wollen, bietet horizOn die nötige Infrastruktur.