Introduction
Ceci est le deuxième article d'une série de trois articles techniques de Jater (Ruohao) Xu, dans lesquels il partage le travail réalisé pour Reverse Collapse : Code Name Bakery. Vous pouvez lire le premier article ici, dans lequel il explore l'utilisation de Wwise pour contrôler les cinématiques du jeu. Restez à l'écoute pour la troisième partie, qui sera publiée dans les prochaines semaines !
Système personnalisé de projection de la position du Listener de Wwise pour une vue 2D inclinée
Série d'articles techniques | Partie 2
Reverse Collapse se distingue par un style artistique particulier, et l'un des choix visuels le caractérisant repose sur des niveaux utilisant un plan 2D incliné. À première vue, le jeu propose une vue en 2D avec une caméra en plongée. Cependant, chaque niveau est, en réalité, méticuleusement conçu avec une légère inclinaison par rapport à l'orientation de la caméra.
L'implémentation de l'audio 3D dans une vue en plongée classique est relativement simple. Cependant, dans une vue 2D inclinée comme celle de Reverse Collapse, le système audio 3D par défaut peut ne pas produire des résultats précis. La première tentative d'implémentation a entraîné des problèmes d'atténuation, en particulier lors des déplacements de la caméra de gauche à droite ou de haut en bas.
Pour résoudre ce problème, un système personnalisé est nécessaire afin d'ajuster le système audio 3D par défaut et de garantir son bon fonctionnement avec la vue 2D inclinée.
L'image ci-dessus illustre le problème que nous avons rencontré : du point de vue de la caméra, la carte est inclinée, ce qui entraîne des imprécisions dans l'atténuation audio par défaut.
La solution repose sur un système de projection simple créé à l'aide des Game Objects de Unity, de scripts et de RTPC dans Wwise, afin d'établir un système de coordonnées X, Y et Z spécialement conçu pour l'audio. En déplaçant le Listener audio de sa position par défaut, sur la caméra principale, vers une position recalculée après la rotation de la carte, nous pouvons régler ce problème. Cette approche s'intègre parfaitement au système d'atténuation audio par défaut de Wwise. De plus, nous pouvons utiliser ce système de coordonnées personnalisées pour des cas spécifiques nécessitant un ajustement manuel de l'atténuation à l'aide des RTPC de Wwise.
Pour cela, nous devons d'abord configurer l'emplacement projeté du Listener, représenté dans la vidéo ci-dessous par le cube mauve, en utilisant un Prefab. Ce Game Object doit pouvoir être attaché à n'importe quelle caméra, avec un décalage fixe par rapport à la caméra principale. Il est essentiel d'en faire un Prefab, car notre projet comporte plusieurs configurations de caméra. Ainsi, il est essentiel de pouvoir placer ou modifier le système de projection en tant qu'enfant du Game Object de n'importe quelle configuration de caméra, directement lors de l'exécution. Cependant, cette étape peut varier selon les projets.
Une fois le Prefab configuré au bon emplacement, l'étape suivante consiste à ajouter le script AkAudioListener.cs, inclus dans l'intégration Unity de Wwise, sur le Game Object parent du Prefab. Cette action permet de définir ce Game Object comme Listener audio du jeu. Ensuite, nous devons supprimer le Listener audio par défaut situé sur le Game Object MainCamera.
L'image ci-dessus met en évidence la configuration du Prefab de notre Game Object dédié au Listener dans le système de projection sonore ; nous l'avons nommé SoundProjectSampler.
La vidéo ci-dessus illustre le problème lié à la vue de la caméra et présente le système final fonctionnant dans le moteur de jeu.
Dans Wwise, nous devons configurer les RTPC pour transférer les données de coordonnées depuis Unity vers Wwise. Cela nous permet d'appliquer les modifications sonores que nous voulons. L'étendue spécifique de chaque RTPC dépend de la taille en unités de chaque niveau du jeu. Dans notre cas, nous avons défini une étendue allant de 0 à 100.
Sur le Game Object de caméra, comme dans la solution précédente, nous devons attacher le script et inclure ces appels de RTPC dans la fonction LateUpdate(). Bien que cela puisse également fonctionner avec Update(), l'utilisation de LateUpdate() garantit que toutes les opérations de rendu soient terminées avant la mise à jour des coordonnées audio. Ce séquençage permet de maintenir la synchronisation entre l'audio et les éléments visuels.
AkSoundEngine.SetRTPCValue(CameraDistance_X, Normalization(soundProjectionSampler.transform.position.x, 0.0f, 100.0f));
AkSoundEngine.SetRTPCValue(CameraDistance_Y, Normalization(soundProjectionSampler.transform.position.y, 0.0f, 100.0f));
AkSoundEngine.SetRTPCValue(CameraDistance_Z, Normalization(soundProjectionSampler.transform.position.z, 0.0f, 100.0f));
Notez que dans la solution ci-dessus, vous trouverez une fonction d'aide appelée Normalisation() qui convertit toute valeur flottante donnée en fonction d'un intervalle minimum et maximum vers un intervalle final compris entre 0 et 1. Il est fortement recommandé de disposer d'une telle fonction pour aider à unifier l'étendue du RTPC avec lequel nous travaillons. Cette fonction peut être implémentée simplement en suivant la formule mathématique de normalisation suivante :
Valeur normalisée = (Valeur à normaliser - Limite inférieure) / (Limite supérieure - Limite inférieure)
De nombreux exemples d'implémentation de cette formule existent dans différents langages de programmation, notamment en C# et en C++ ; une simple recherche en ligne fournira une multitude de résultats à ce sujet, c'est pourquoi nous ne nous attarderons pas ici sur cette partie.
Une fois ce RTPC intégré, nous pouvons obtenir des résultats audio précis en utilisant le système d'atténuation par défaut de Wwise. De plus, nous bénéficions d'une grande flexibilité pour affiner chaque son en appliquant les RTPC de coordonnées X, Y et Z directement aux sources audio elles-mêmes. Cela permet aux concepteurs sonores de définir leur propre système d'atténuation ou de le compléter en plus du système d'atténuation par défaut.
L'exemple ci-dessus montre comment l'atténuation du son des champignons (« Burning Fungus ») est modifiée lorsqu'ils sont enflammés par des grenades dans le niveau 3009 du jeu. Au départ, le son du champignon est configuré comme un son 3D avec l'atténuation de Wwise, en utilisant ses paramètres d'atténuation par défaut. En parallèle, l'atténuation est également contrôlée par les coordonnées projetées que nous avons définies, ce qui permet de personnaliser et d'ajuster l'atténuation sonore en fonction d'unités précises reçue depuis le niveau du jeu.
En plus de fonctionner avec les profils d'atténuation existants, les RTPC de coordonnées X, Y et Z peuvent également générer de manière indépendante des effets d'atténuation sur les sons au niveau de leur Game Object. Les concepteurs sonores peuvent ajuster le son sur chaque axe de la carte, ce qui permet de faire des réglages précis pour garantir une acoustique fidèle que peuvent entraîner les angles spécifiques de certains niveaux, comme ceux présents dans Reverse Collapse.
Cette flexibilité permet aux concepteurs sonores de créer des expériences audio immersives qui s'accordent parfaitement avec les visuels du jeu et renforcent son atmosphère générale.
Avertissement : Les extraits de code utilisés dans cet article sont des versions génériques reconstituées et destinées uniquement à des fins d'illustration. La logique sous-jacente a été vérifiée pour fonctionner correctement, les appels et fonctions API spécifiques au projet ont été omis des exemples en raison de restrictions potentielles en matière de droits d'auteur.
Commentaires