Kit de survie : Du Voice Chat dans un jeu VR avec Unreal Engine

Lorsque nous avons commencé à développer des jeux multijoueur en VR pour salles d’arcade, nous avons pensé que les joueurs, placés dans des box proches, s’entendraient parler. La pratique est loin d’être aussi simple ! Entre le volume global de chaque machine client, la disposition des boxes, l’acoustique de l’espace… tenter de mixer du son réel avec le son du jeu est un véritable casse-tête. La solution : passer par du Voice Chat en jeu permet un contrôle beaucoup plus précis du mixage et de la capacité des joueurs à communiquer.

Voice Chat dans un jeu VR grâce à Unreal Engine : prérequis

  • Ce tutoriel a été testé sur Unreal Engine 4.19.2.
  • Certaines fonctions utilisées dans ce tutoriel ne sont pas exposées en Blueprint. Pour un projet Blueprint, on peut utiliser le plugin AdvancedSessions qui expose les fonctions requises.
  • Le projet doit utiliser un OnlineSubsystem pour gérer les connexions.

Pour commencer un chat vocal sur UE4 : c'est quoi un OSS ?

OSS

Un OnlineSubsystem (OSS en bref) est un plugin qui respecte une architecture bien spécifique, dans le but d’harmoniser la gestion des fonctionnalités réseau entre différentes plate-formes. Il permet :

  • d'identifier et connecter un joueur via l’interface Identity
  • de gérer sa liste d’amis via l’interface Friends

Et ceux qui nous intéressent ici :

  • créer/rejoindre une partie via l’interface Sessions
  • gérer le Voice Chat via l’interface Voice

Il en existe plusieurs selon la plate-forme ciblée (Steam, XBox Live...). Dans nos projets, nous utilisons le OnlineSubsystemNull, qui propose une implémentation basique pour un fonctionnement en LAN.

Pour utiliser OnlineSubsystemNull dans un projet, commencer par vérifier que les plugins sont actifs (Edit → Plugins → Online Platform → OnlineSubsystem et OnlineSubsystemNull). Puis ajouter ces quelques lignes de configuration dans DefaultEngine.ini pour activer l’OSS voulu avec la fonctionnalité de Voice Chat :

[OnlineSubsystem]
DefaultPlatformService=Null
bHasVoiceEnabled=true

[Voice]
bEnabled=true

Voice chat Unreal Engine : se connecter via l'OSS

Créer et rejoindre une Session gérée par l’OSS peut se faire par des noeuds Blueprint.

Côté serveur :

  • CreateSession pour créer une session. Avec AdvancedSessions, CreateAdvancedSession expose plus d’options, et notamment un tableau de SessionSettings qui permet d’ajouter autant d’informations que l’on souhaite dans la Session.

Côté client :

  • FindSessions pour lister les Sessions existantes. Avec AdvancedSessions, les noeuds FindSessionsAdvanced et FilterSessionResults permettent filtrer les résultats via les SessionSettings afin de retrouver plus facilement une Session spécifique.
  • JoinSession pour rejoindre la Session choisie.

server et client voice chat

Activer le chat vocal avec Unreal Engine

C’est déjà fait ! À un petit détail près : par défaut, le Voice Chat fonctionne en Push-to-Talk, ce qui signifie que le micro ne s’active que par une action manuelle.

Deux options :

On peut simplement désactiver le Push-to-Talk en ajoutant la ligne suivante dans :

DefaultGame.ini :
[/Script/Engine.GameSession]
bRequiresPushToTalk=true

Sinon, il faut appeler manuellement les fonctions IOnlineVoicePtr::StartNetworkedVoice() et IOnlineVoicePtr::StopNetworkedVoice() (exposées en Blueprint par le plugin AdvancedSessions) pour activer/désactiver son micro.

On peut les associer à une touche, mais aussi les appeler à n’importe quel moment dans le gameplay (par exemple si un joueur décroche un interphone).

il n’est malheureusement pas possible de tester le Voice Chat directement dans l’éditeur, en utilisant la fonction Play In Editor (PIE) avec plusieurs joueurs. Le PIE connecte automatiquement les joueurs sans passer par l’OSS, ce qui empêche d’utiliser les fonctionnalités associées.

Petit script utile :

[CheminVersUE]\Engine\Binaries\Win64\UE4Editor.exe [CheminVersProjet]\MonProjet.uproject NomDeMap -game -windowed -resX=800 -resY=600

Ce script lance une instance séparée du projet en mode Game (sans éditeur donc) dans une fenêtre. On peut en lancer plusieurs, puis les connecter en utilisant l’interface Sessions.

test multi voice chat PIE

Et voilà ! On a une session de jeu avec du Voice Chat.

Le son saccade et la qualité laisse à désirer ? C’est normal ! Il faut…

Booster le réseau !

Par défaut et pour éviter de saturer le réseau, Unreal Engine autorise une bande passante de 32 ko/s à partager entre toutes les connections au serveur.

Cette limite, suffisante pour des informations de gameplay, est en revanche un peu limite pour permettre du Voice Chat de qualité suffisante. Heureusement, ces valeurs peuvent se configurer (valeurs trouvées de façon empirique, il faudra se pencher plus en détail sur le code du moteur pour comprendre exactement qui fait quoi !) :

Dans DefaultGame.ini

[/Script/Engine.GameNetworkManager]
TotalNetBandwidth=500000 
MaxDynamicBandwidth=80000
MinDynamicBandwidth=20000

Dans DefaultEngine.ini :

[/Script/Engine.Player]
ConfiguredInternetSpeed=500000 
ConfiguredLanSpeed=500000

[/Script/OnlineSubsystemUtils.IpNetDriver]
MaxClientRate=80000
MaxInternetClientRate=80000

Une fois ces modifications faites, le Voice Chat devient beaucoup plus clair !

Personnaliser le Voice Chat dans Unreal Engine

La problématique de départ était de faire en sorte que les joueurs s’entendent clairement malgré le son du jeu. Une fois le Voice Chat fonctionnel, il faut donc l’intégrer au mixage global.

Pour ce faire, on peut spécifier une SoundClass spécifique (Project Settings → Audio → VOIPSoundClass) qui contrôle le Voice Chat.

On peut donc régler le volume et plusieurs autres propriétés qui s’appliqueront au son du Voice Chat, mais aussi utiliser un SoundMix pour réduire les autres sons quand quelqu’un parle si besoin.

Autre fonctionnalité intéressante : depuis la 4.19 il est possible de spatialiser le Voice Chat !

Il suffit pour cela de créer un composant VOIPTalker associé à un joueur (noeud Blueprint CreateTalkerForPlayer) pour que sa voix soit émise depuis la position du composant.

Dans le VOIPTalker, on peut spécifier :

  • À quel objet le composant est attaché, ce qui permet de faire sortir la voix du joueur d’où on veut (de sa tête, d’un talkie-walkie…)
  • Un AttenuationSettings pour contrôler la spatialisation
  • Un Sound Effect Preset Chain si l’on veut appliquer des effets spécifiques sur la voix

Chat Vocal et Unreal Engine : conclusion

Finalement, intégrer du Voice Chat n’est pas si complexe, Unreal Engine fournit (désormais) tous les outils pour y arriver. La principale difficulté provient du fait que la fonctionnalité est peu documentée, et qu’il y a plusieurs informations à connaître (Sessions, fichiers de configuration, bande-passante…) qui sont difficile à trouver au même endroit. C’est d’ailleurs ce qui a motivé cet article.

ouvertures : pour aller plus loin

Nous allons continuer à expérimenter avec le Voice Chat et la spatialisation pour proposer des expériences VR multijoueurs encore plus immersives.

Mais au-delà de ça, notre prise de compétence sur Unreal Engine et ses fonctionnalités réseau nous permet de développer des outils de plus en plus spécialisés pour servir au mieux notre offre clé en main pour les salles d’arcade (gestion des parties, affichage des scores…) Bientôt un OnlineSubsystemOctopod (teasing!) ? C’est possible !

sources :

À savoir que nous prévoyons une traduction de cet article, car on pense vraiment que ça aidera des confrères !

Commentaires

Il n'y a actuellement aucun commentaire. Soyez le premier !

Articles liés