📖 Le Contexte : "La vie a un prix"
Dans l'industrie du jeu vidéo, créer des PNJ (Personnages Non Joueurs) crédibles et vivants coûte extrêmement cher. Des mastodontes comme Red Dead Redemption 2 ou Hades dépensent des millions pour atteindre ce niveau de réalisme et d'immersion. Malheureusement, c'est un luxe qui n'est souvent pas à la portée des studios indépendants ou des petites équipes.
C'est de ce constat qu'est né NPCForge. Notre objectif : proposer aux développeurs indépendants un moyen abordable et accessible de donner vie à leurs univers virtuels grâce à des PNJ dotés de dialogues infinis et d'une mémoire persistante, sans exploser leur budget. L'idée est de s'inspirer de projets de recherche novateurs comme Voyager ou Stanford Smallville pour l'appliquer concrètement au développement de jeux vidéo.

🐺 Le Cas Pratique : Une partie de Loup-Garou 100% IA
Pour tester et éprouver notre solution en conditions réelles, l'équipe a développé un jeu de démo : une partie de Loup-Garou où le joueur n'est que spectateur. Des IAs se voient attribuer des rôles, discutent entre elles, argumentent et votent jusqu'à la fin de la partie. Cela démontre de manière très visuelle les capacités de l'API à gérer des conversations multiples et complexes.
🎯 Mon Rôle : Chef de Projet & Dev Plugin
NPCForge est né de la collaboration de 4 développeurs (Mathieu Rio, Tristan Bros, Hugo Fontaine et moi-même) répartis aux quatre coins du globe (Corée du Sud, Suède, Allemagne). J'ai porté deux casquettes majeures sur ce projet :
1. Chef de projet
C'était ma première expérience de gestion sur un projet aussi libre, avec un éloignement géographique important. Mon défi a été de coordonner 3 pôles distincts (API, Plugin, Jeu de démo) en imposant une méthodologie Scrum. J'ai eu la difficile tâche de m'imposer légitimement comme décisionnaire global, une position que j'ai tenue en tranchant sur les décisions structurantes tout en laissant une autonomie totale à chaque responsable sur l'implémentation de sa partie.
2. Développeur Lead sur le Plugin UE5
J'ai choisi de m'occuper du plugin Unreal Engine car c'était la pièce centrale du système. Avoir un pied dans le moteur de jeu (où la magie opère visuellement) et l'autre dans l'API Golang me permettait d'avoir une vision complète sur le projet et de guider les équipes efficacement. Pour fluidifier le travail et tenir les deadlines, j'ai dû constamment jongler entre le C++, le Blueprint et le Go.
🧠 Sous le capot : Architecture & Défis Techniques
Le cœur du système repose sur une séparation claire des responsabilités entre le moteur de jeu (plugin natif C++ sous Unreal Engine 5) et un serveur applicatif centralisé.

⚙️ Golang au cœur du système : Le Chef d'Orchestre
Développé en Go, le backend agit comme le véritable cerveau centralisateur de l'infrastructure. Ce choix technologique était motivé par le besoin de hautes performances et la gestion robuste de la concurrence (via les goroutines). Son rôle est double :
- Coordonner simultanément plusieurs instances de jeu, tout en gérant la persistance (PostgreSQL) et l'évolution de la mémoire continue des IAs.
- Servir de passerelle modulaire vers l'API OpenAI, choisie stratégiquement pour son excellent ratio qualité/prix/vitesse. Cette architecture centralisée garantit que le modèle de langage (LLM) peut être facilement remplacé ou mis à jour à l'avenir sans impacter le code critique côté jeu.
🚧 Le Défi Technique : Le goulot d'étranglement
Dans nos premières itérations, la communication entre le jeu et le serveur s'effectuait de manière complètement centralisée via un tunnel WebSocket unique. Nos NPCs étant conçus pour être proactifs, ils sollicitaient en permanence le serveur pour évaluer leur environnement et proposer des interactions.
Ce modèle a rapidement créé un goulot d'étranglement critique : la pile d'appels s'engorgeait, provoquant une latence inacceptable pour une application en temps réel et détruisant toute illusion de fluidité pour les joueurs.
💡 La Solution : "Cerveaux Asynchrones" et Concurrence
Pour faire sauter ce verrou logiciel, nous avons entièrement repensé la logique de communication en exploitant pleinement la puissance de Golang :
- Émancipation cognitive via Goroutines : Plutôt qu'un traitement séquentiel centralisé, chaque IA est désormais rattachée à un "cerveau asynchrone" indépendant côté serveur. Déployés via des goroutines, ces cerveaux communiquent en parallèle et de manière asynchrone avec l'API externe, vaporisant virtuellement la file d'attente globale.
- Culling cognitif et optimisation dynamique : Paralléliser aveuglément les appels risquait de saturer les quotas d'API et d'entraîner des coûts faramineux. Pour y remédier, nous avons mis en place une boucle d'optimisation intelligente avec Unreal Engine : le moteur de jeu contrôle maintenant activement l'état de "réflexion" des IAs. Si un PNJ est trop éloigné du joueur ou n'a aucune interaction potentielle, son processus cognitif est suspendu par le serveur de manière ciblée (principe du culling). Cette synergie garantit d'excellentes performances globales tout en maintenant des coûts d'infrastructure acceptables.
🔭 La Vision et la Suite
Bien que les IAs de notre démo soient limitées à la discussion, notre vision à long terme est bien plus vaste. La prochaine grande étape visera à permettre aux PNJ de se déplacer et d'interagir activement avec leur environnement.
Les chantiers futurs incluent :
- La stabilisation des "hallucinations" de l'IA pour un comportement plus prévisible.
- L'abstraction de l'API pour la rendre plus générique et accueillir une plus grande variété de types de jeux.
- La création d'interfaces utilisateur simplifiées pour faciliter l'intégration côté développeur.
- Des portages potentiels sur d'autres moteurs de jeu du marché.