Contourner la limite de 32 caractères de l'UEFN Analytics Device Event Name (Tutoriel Verse)
Tout développeur technique de jeux connaît le moment précis où son pipeline de télémétrie s'effondre : lorsque vous devez suivre un état complexe du joueur, mais que votre moteur restreint la quantité de données que vous pouvez envoyer. Si vous développez dans l'Unreal Editor for Fortnite, vous avez probablement déjà heurté de plein fouet la limite de caractères de l'EventName de l'UEFN analytics device.
Comme l' analytics_device natif ne supporte pas le passage d'arguments arbitraires ou de payloads JSON, les développeurs sont forcés d'être "créatifs". Vous finissez par concaténer des variables dans des chaînes illisibles comme Player_Left_During_G1_F_Active_M juste pour construire un entonnoir (funnel) d'analyse de base.
Mais il y a un arrêt brutal : le nom de l'événement ne peut pas dépasser 32 caractères.
Dès que vous essayez d'ajouter un type d'arme, une zone de coordonnées ou un timestamp de match, l'appareil le rejette. Vos flux de données se brisent, le comportement de vos joueurs reste un mystère et votre stratégie de live-ops s'effondre avant même d'avoir commencé.
Dans ce tutoriel, nous allons concevoir un système robuste d'encodage de télémétrie en utilisant Verse. Nous verrons comment compresser systématiquement des états de jeu complexes en chaînes de moins de 32 caractères, centraliser vos appels analytiques et décoder ces chaînes sur votre backend pour construire de véritables entonnoirs de données lisibles.
L'anatomie d'un goulot d'étranglement de télémétrie
Pour contourner cette limitation, il faut d'abord comprendre pourquoi elle existe. Les plateformes d'analyse standard comme Mixpanel, Amplitude ou les backends personnalisés traitent les événements comme des objets structurés. Un payload de télémétrie standard ressemble généralement à ceci :
{
"event_name": "player_quit",
"properties": {
"game_phase": 1,
"active_flag": "F",
"player_class": "Medic",
"time_alive_seconds": 145
}
}
Cet objet JSON est très lisible. Cependant, l'environnement sandbox de l'UEFN limite strictement les données sortantes pour éviter l'encombrement des bases de données sur les serveurs d'Epic et optimiser la taille des paquets pendant le gameplay.
Au lieu d'un objet JSON riche, l'UEFN vous force à aplatir tout votre état de télémétrie en une seule clé primaire : l'EventName. Avec une restriction à 32 caractères (soit 32 octets de données ASCII), chaque caractère doit être traité comme une ressource précieuse.
L'approche naïve consiste à écrire des chaînes descriptives jusqu'à atteindre la limite. L'approche professionnelle consiste à construire un encodeur de télémétrie piloté par schéma.
Étape 1 : Concevoir un encodeur de télémétrie dans Verse
Au lieu de placer plusieurs Analytics Devices sur votre carte, vous devez piloter toutes les analyses via un script Verse centralisé. Ce script agira comme une couche middleware, interceptant l'état du jeu, le compressant selon un schéma strict et le transmettant à l'appareil.
Utilisez des codes courts : PQ pour "Player_Quit", M pour "Medic". En standardisant ces codes, vous pouvez compacter énormément de données.
Exemple de classe d'encodage en Verse :
# (Code Verse identique à l'original)
Payload := "E:{EventType}|C:{ClassCode}|Z:{ZoneStr}|T:{TimeStr}"
if (Payload.Length <= 32):
AnalyticsDevice.RecordEvent(Payload)
Étape 2 : Bit-Packing avancé pour les données haute densité
Si vous devez suivre des coordonnées X/Y exactes, une chaîne comme -14502, 23049 consomme 13 caractères. Pour résoudre cela, implémentez un hachage spatial ou un encodage par grille. Divisez votre carte en une grille de 100x100 et assignez à chaque cellule un ID alphanumérique de 4 caractères (ex: A01).
Étape 3 : Décodage de la télémétrie sur votre Backend
Une fois les données exportées en CSV depuis le portail Epic, utilisez un script Python (avec Pandas) pour parser le schéma E:Type|C:Code|Z:ID|T:Time et reconstruire vos colonnes de données.
Le point de rupture : Quand quitter la Sandbox
Si vous passez des semaines à écrire des compresseurs de chaînes, vous vous battez contre le moteur. En passant de l'UEFN à Unreal Engine 5 standard, ces limitations disparaissent. Vous pouvez utiliser le HttpModule ou les WebSockets pour envoyer du JSON brut. Voir notre guide Ditch Http Polling An Unreal Engine Websockets Tutorial For Real Time Backends.
Avec horizOn, ces services backend sont préconfigurés. Vous envoyez votre JSON via API, et horizOn indexe les données automatiquement.
5 Bonnes pratiques
- Standardisez vos délimiteurs : Utilisez toujours le même (ex:
|). - Ne suivez jamais de données continues : Évitez le
Tick, envoyez des événements uniquement lors de changements d'état. - Maintenez un document de schéma externe : Documentez vos codes courts.
- Séparez la télémétrie technique de l'analyse métier.
- Validez avant d'envoyer : Vérifiez la longueur dans Verse avant l'appel.