CRÉEZ VOTRE MONDE
Conversation
Utilisation de la fonction de chat vocal
25min
la version préliminaire du package zepeto voice chat permet le chat vocal dans le monde installer zepeto voice chat et définir le mode 1\) installer windows → gestionnaire de packages → zepeto voice chat cette fonctionnalité est disponible dans un monde où des éléments multijoueurs sont implémentés les tests ne sont disponibles que dans le test mobile, pas dans le test éditeur en raison de la politique ios, le volume de l'appareil ne tombe pas à zéro lorsque le microphone est activé dans les mondes avec chat vocal activé le volume de l'appareil tombera à zéro lorsque le microphone sera désactivé 2\) cliquez sur le bouton \[▼] dans le menu du milieu de l'écran du projet unity qui est en cours de développement cliquez sur le bouton \[ouvrir les paramètres du monde] dans le menu contextuel qui apparaît 3\) si le package zepeto voice chat est installé correctement, vous verrez l'option mode de chat vocal ajoutée 4\) en mode de chat vocal, veuillez définir le mode souhaité basique utilisez la fonction de chat vocal fournie par défaut script utilisez la fonction de chat vocal en implémentant l'api de chat vocal vous pouvez traiter l'entrée/sortie d'accès à la salle pour le chat vocal à l'exécution implémentez le chat vocal pour des équipes distinctes (par exemple, chat vocal de l'équipe rouge et chat vocal de l'équipe bleue) détection de l'utilisateur parlant actuellement mode de base utilisation de la fonction de chat vocal un monde avec le chat vocal en mode de base ressemble à ceci vous pouvez également créer des chats vocaux plus divertissants en utilisant la fonction de modulation vocale le chat vocal est automatiquement activé lors de l'entrée dans le monde avec la fonction de chat vocal 👍 la première fois que vous utilisez la fonction de chat vocal dans zepeto, une fenêtre contextuelle concernant l'accès au microphone apparaîtra vous devez autoriser l'accès pour utiliser la fonction de chat vocal vous pouvez l'utiliser en touchant le bouton de chat vocal dans l'application zepeto 3 26 000 et supérieure, l'icône du haut parleur de chat vocal n'apparaît pas si vous souhaitez faire apparaître l'icône de discours, veuillez passer en mode script et suivre le guide pour écrire votre propre code mode script utilisation de l'api voicechat le mode script permet le chat vocal dans les canaux séparés par équipes veuillez vous référer à la description de la fonction et à l'exemple ci dessous pour mettre en œuvre la fonctionnalité api description oninitializedevent les api de chat vocal sont disponibles après qu'un événement true se soit produit dans l'événement d'initialisation si cet événement est true, le chat vocal est disponible, et s'il est false, le chat vocal n'est pas disponible enterroom(roomproperty roomproperty) fonctions pour entrer dans une salle de chat vocal \ après être entré avec succès dans la salle de chat vocal, le bouton de chat vocal apparaîtra exitroom() fonction pour quitter une salle de chat vocal onroomconnectedevent un événement pour vérifier l'état d'entrée dans une salle de chat vocal si cet événement est vrai, l'utilisateur est entré dans la salle de chat vocal ; s'il est faux, l'utilisateur a quitté la salle de chat vocal onspeechdetectedevent\<string, boolean> événement pour détecter l'utilisateur qui parle actuellement dans le chat vocal \ string est l'userid de l'utilisateur qui parle \ boolean est vrai lorsque l'énoncé commence, faux lorsque l'énoncé se termine changeteamid(number teamid) fonction pour changer le teamid utilisé dans la salle de chat vocal \ peut seulement être défini sur une valeur int de 1 ou plus classe roomproperty api description setaudiomode mode audio à utiliser dans le chat vocal \ audiomode omnidirectionnel mode de chat vocal sans atténuation de la voix basée sur la distance (vous pouvez l'utiliser avec ou sans le personnage zepeto) \ audiomode directionnel mode de chat vocal avec atténuation de la voix basée sur la distance (le personnage zepeto doit être présent dans la scène, car ce mode fonctionne en fonction de l'emplacement du personnage zepeto) setteamid teamid à utiliser dans le chat vocal pour activer le chat vocal entre les utilisateurs ayant le même teamid \ ne peut être défini qu'à une valeur entière de 1 ou plus exemple d'implémentation de chat vocal spécifique à une équipe voici un exemple de code pour essayer l'api de chat vocal 1\) ajoutez un bouton et enregistrez le texte sur le canevas comme indiqué dans l'image ci dessous pour entrer dans le canal de l'équipe de chat vocal et afficher le journal d'état bouton bouton equipebleue bouton d'entrée pour le chat vocal de l'équipe bleue bouton equiperouge bouton d'entrée pour le chat vocal de l'équipe rouge bouton sortie bouton de sortie du chat vocal texte texte journal texte à afficher pour le journal de chat texte equipe texte à afficher pour la liste des membres du même canal de chat vocal texte encoursdeparler texte à afficher pour l'userid qui parle actuellement dans le chat vocal 2\) créer un projet > créer > zepeto > typescript et le renommer en voicechattest 3\) écrire un script d'exemple comme indiqué ci dessous voicechattest import { button, inputfield, text } from 'unityengine ui'; import { zepetoscriptbehaviour } from 'zepeto script' import { audiomode, roomproperty, voicechatcontroller } from 'zepeto voice chat' export default class voicechattest extends zepetoscriptbehaviour { // déclarez les composants ui comme membres publics public blueteambutton button; public redteambutton button; public exitroombutton button; public logtext text; public currentteamidtext text; public currentspeakinguseridstext text; // déclarez des membres privés pour stocker les id des utilisateurs parlant et le champ de saisie de l'id de l'équipe private currentspeakinguserids string\[]; private teamidinputfield inputfield; start() { this currentspeakinguserids = new array(); // ajoutez des écouteurs d'événements pour les clics sur les boutons this blueteambutton onclick addlistener(()=>{ this enterblueteam(); }); this redteambutton onclick addlistener(()=>{ this enterredteam(); }); this exitroombutton onclick addlistener(()=>{ this exitvoicechatroom(); }); // ajoutez des écouteurs d'événements pour le contrôleur de chat vocal voicechatcontroller oninitializedevent addlistener(init => this oninitialized(init)); voicechatcontroller onroomconnectedevent addlistener(connected => this onroomconnected(connected)); voicechatcontroller onspeechdetectedevent addlistener((userid, speechdetected) => this onspeechdetected(userid, speechdetected)); this logtext text = "\[voicechat] voicechattest démarrer"; } // méthode ondestroy appelée lorsque le script est détruit ondestroy() { voicechatcontroller oninitializedevent removealllisteners(); voicechatcontroller onroomconnectedevent removealllisteners(); voicechatcontroller onspeechdetectedevent removealllisteners(); } // méthode appelée lorsque le système de chat vocal est initialisé private oninitialized(initialized boolean) { this logtext text = "\[voicechat] oninitialized " + initialized; } // méthode appelée lorsque la salle de chat vocal est connectée private onroomconnected(connected boolean) { this logtext text = "\[voicechat] onroomconnected " + connected; } // méthode appelée lorsqu'un discours d'utilisateur est détecté ou non détecté private onspeechdetected(userid string, speechdetected boolean) { this logtext text = "\[voicechat] onspeechdetected " + userid + ", " + speechdetected; if (speechdetected) { this currentspeakinguserids push(userid); } else { let index = this currentspeakinguserids indexof(userid); this currentspeakinguserids splice(index, 1); } let userids = "\[currentspeakinguserids]\n"; for (let i = 0; i < this currentspeakinguserids length; i++) { userids += this currentspeakinguserids\[i]; userids += "\n"; } this currentspeakinguseridstext text = userids; } // méthode pour entrer dans la salle de chat vocal de l'équipe bleue public enterblueteam(){ this entervoicechatroom(2); } // méthode pour entrer dans la salle de chat vocal de l'équipe rouge public enterredteam(){ this entervoicechatroom(3); } // méthode pour entrer dans une salle de chat vocal en fonction de l'index de l'équipe donné private entervoicechatroom(teamindex number) { console log("\[voicechat] entervoicechatroom"); // créez un nouvel objet roomproperty et définissez ses propriétés let roomproperty = new roomproperty(); roomproperty setaudiomode(audiomode omnidirectional); roomproperty setteamid(teamindex); voicechatcontroller enterroom(roomproperty); this currentteamidtext text = "teamid " + roomproperty teamid tostring(); } // méthode pour quitter la salle de chat vocal public exitvoicechatroom() { this logtext text = "\[voicechat] exitvoicechatroom"; voicechatcontroller exitroom(); } // méthode pour changer l'id de l'équipe pour l'utilisateur actuel public changeteamid() { // obtenez le nouvel id d'équipe à partir du champ de saisie et parsez le en tant qu'entier let teamid = parseint(this teamidinputfield text); this logtext text = "\[voicechat] changeteamid " + teamid; this currentteamidtext text = "teamid " + teamid tostring(); // changez l'id de l'équipe dans le système de chat vocal voicechatcontroller changeteamid(teamid); } } description du code lorsque le script s'exécute, il enregistrera un événement sur chaque bouton dans la fonction start() et enregistrera les événements oninitialized, onroomconnected et onspeechdetected sur le voicechatcontroller lorsque le bouton de l'équipe bleue ou le bouton de l'équipe rouge est cliqué, la fonction entervoicechatroom() est exécutée et l'utilisateur entre dans la salle de chat vocal en entrant la roomproperty spécifiée les propriétés de la salle dans l'exemple sont les suivantes roomproperty setaudiomode audiomode omnidirectional le mode audio omnidirectionnel est un mode où le volume sonne de la même manière, quelle que soit la position du joueur en revanche, le mode directionnel est un mode sonore 3d, ce qui signifie que le volume sonnera différemment selon la position du personnage, donc plus le personnage est éloigné, plus le volume sera faible roomproperty setteamid canal 2 pour l'équipe bleue, canal 3 pour l'équipe rouge setteamid agit comme un canal dans le chat vocal une équipe qui entre dans le canal 2 ne peut discuter vocalement qu'avec les joueurs du canal 2, et une équipe qui entre dans le canal 3 ne peut discuter vocalement qu'avec les joueurs du canal 3 exitvoicechatroom() quittera le canal de chat vocal de l'équipe actuelle onspeechdetected() affichera l'id du joueur qui utilise actuellement le chat vocal dans le canal de l'équipe dans le texte du journal 4\) après avoir terminé le script, assignez le bouton et le texte créés à l'étape 1 dans l'inspecteur 5\) exécutez le test sur mobile via le code qr ou le lien de test, et vous pouvez voir que le bouton d'activation du chat vocal est créé lorsque le bouton entrer dans l'équipe est pressé, et chaque fois qu'un joueur parle, le journal montre quel joueur est dans le chat vocal, comme indiqué dans l'écran suivant exemple d'affichage d'une image de bulle de chat vocal dans l'application zepeto 3 26 000 et les versions ultérieures, l'icône d'énonciation du chat vocal n'apparaît pas si vous souhaitez gérer l'apparition de l'icône d'énonciation, veuillez suivre le guide et écrire votre propre code 1\) pour afficher une bulle de dialogue au dessus de la tête du personnage lorsque le joueur est dans le chat vocal, vous devrez créer un prefab qui utilise une image de bulle de dialogue importez l'image png de bulle de dialogue que vous souhaitez utiliser comme indiqué ci dessous et changez son type de texture en sprite 2\) projet > créer > prefab et renommez le en chatbubble 3\) double cliquez sur le prefab chatbubble pour entrer en mode d'édition du prefab sélectionnez le prefab chatbubble et choisissez transform > position > changez la valeur y à 0 35 4\) créez un canvas à l'intérieur de l'objet prefab double cliquez sur le prefab chatbubble pour entrer en mode d'édition de prefab, puis ajoutez hiérarchie > ui > canvas changez les valeurs du composant recttransform du canvas comme suit posx 0 , posy 0 largeur 100, hauteur 100 échellex 0 005, échelley 0 005, échellez 0 005 changez le rendermove du composant canvas en espace mondial 5\) créez une image de bulle de dialogue à l'intérieur du canvas ajoutez hiérarchie > ui > image comme enfant du canvas, et renommez le chatbubbleimage changez les valeurs du composant recttransform de chatbubbleimage comme suit largeur 42, hauteur 42 enregistrez le sprite d'image que vous avez importé à l'étape 1 comme image source dans le composant image 👍 conseil vous pouvez également animer l'image sprite de la bulle de dialogue vous pouvez également utiliser des images de bulles séparées pour différentes équipes 6\) projet > créer > zepeto > créer un typescript et le renommer en voicechatbubblecontroller 7\) écrivez un script d'exemple comme indiqué ci dessous voicechatbubblecontroller import { gameobject, object } from 'unityengine'; import { knowsockets, zepetoplayers } from 'zepeto character controller' import { zepetoscriptbehaviour } from 'zepeto script' import { audiomode, roomproperty, voicechatcontroller } from 'zepeto voice chat'; export default class voicechatbubblecontroller extends zepetoscriptbehaviour { // variable publique gameobject pour stocker le prefab de la bulle de chat vocal public voicechatprefab gameobject; // carte privée pour stocker les gameobjects associés aux id d'utilisateur private voicebubblemap map\<string, gameobject> = new map\<string, gameobject>(); start() { // ajouter des écouteurs d'événements pour le contrôleur de chat vocal voicechatcontroller oninitializedevent addlistener(init => this oninitialized(init)); voicechatcontroller onroomconnectedevent addlistener(connected => this onroomconnected(connected)); voicechatcontroller onspeechdetectedevent addlistener((userid, speechdetected) => this onspeechdetected(userid, speechdetected)); } // méthode appelée lorsque le système de chat vocal est initialisé private oninitialized(initialized boolean) { console log("\[voicechat] oninitialized "); this entervoicechatroom(1); } // méthode appelée lorsque la salle de chat vocal est connectée private onroomconnected(connected boolean) { console log("\[voicechat] onroomconnected "); } // méthode pour entrer dans une salle de chat vocal en fonction de l'index de l'équipe donné private entervoicechatroom(teamindex number) { console log("\[voicechat] entervoicechatroom"); // créer un nouvel objet roomproperty et définir ses propriétés let roomproperty = new roomproperty(); roomproperty setaudiomode(audiomode omnidirectional); voicechatcontroller enterroom(roomproperty); } // méthode appelée lorsqu'un discours d'utilisateur est détecté ou non détecté private onspeechdetected(userid string, speechdetected boolean) { console log("\[voicechat] onspeechdetected " + userid + ", " + speechdetected); // vérifier si l'id d'utilisateur n'est pas dans la carte de bulle vocale et créer une bulle vocale si ce n'est pas le cas if (!this voicebubblemap has(userid)) { this createvoicebubble(userid); } this setvoicebubble(userid, speechdetected); } // méthode pour définir l'état actif de la bulle vocale pour un id d'utilisateur donné private setvoicebubble(userid string, speechdetected boolean) { const chatbubble = this voicebubblemap get(userid); chatbubble setactive(speechdetected); } // méthode pour créer une bulle vocale pour un id d'utilisateur donné private createvoicebubble(userid string) { // obtenir le socket de tête du personnage de l'utilisateur const headsocket = zepetoplayers instance getplayerwithuserid(userid) character getsocket(knowsockets head upper); // instancier le prefab de la bulle de chat vocal à la position du socket de tête const instancebubble = object instantiate(this voicechatprefab, headsocket) as gameobject; // ajouter la bulle instanciée à la carte de bulle vocale this voicebubblemap set(userid, instancebubble); instancebubble setactive(false); } lateupdate() { // vérifier si la carte de bulle vocale est vide et retourner si c'est le cas if (this voicebubblemap size === 0) { return; } // itérer à travers la carte de bulle vocale et mettre à jour la rotation de chaque gameobject de bulle this voicebubblemap foreach((bubbleobject gameobject) => { // définir la rotation de l'objet bulle pour correspondre à la rotation du parent de la caméra bubbleobject transform rotation = zepetoplayers instance zepetocamera cameraparent transform rotation; }); } } description du code lorsque le script est exécuté, il enregistrera des événements sur chaque bouton dans la fonction start() et les événements oninitialized, onroomconnected et onspeechdetected sur le voicechatcontroller après oninitialized(), le bouton de chat vocal sera exposé sur l'écran du joueur lorsqu'il entre dans le monde, et lorsqu'il appuie sur le bouton, entervoicechatroom() sera exécuté pour entrer dans la salle de chat vocal chaque fois que le joueur active voicechat et parle, onspeechdetected() est exécuté, et si speechdetected est vrai, l'objet bubblechat est activé, et s'il est faux, il est désactivé la première fois que la fonction onspeechdetected() est activée, createvoicebubble() instanciera un gameobject voicechatprefab pour flotter au dessus de la tête du joueur et l'enregistrera comme données de carte dans voicebubblemap nous utilisons lateupdate() pour mettre à jour la rotation de la bulle de chat vocal à chaque image pour correspondre au cameraparent du monde zepeto cela garantit que l'image de la bulle de discours fait toujours face à la caméra il vérifie d'abord si voicebubblemap est vide, sinon il met à jour la rotation de l'image de la bulle de discours prefab 8\) après avoir terminé d'écrire le script, assignez l'entrée voicechatprefab dans l'inspecteur comme le prefab de bulle de discours que vous avez créé à l'étape 1 9\) exécutez le sur mobile via un code qr ou un lien de test et vous devriez voir l'image de la bulle de discours apparaître au dessus de la tête du personnage chaque fois que le joueur utilise le chat vocal modulation de la voix à partir de la version 0 2 1 preview de voice chat, vous pouvez moduler la voix de voice chat en mode script https //www youtube com/watch?v=yxfpuqypbqk https //www youtube com/watch?v=yxfpuqypbqk essayez la modulation vocale en utilisant le guide api et le code d'exemple type de voix (enum) valeur description type00 0 original type01 1 souris type02 2 oncle type03 3 écho type04 4 voix profonde type05 5 robot type06 6 dialecte type07 7 mégaphone type08 8 bête type09 9 machine type10 10 courant fort type11 11 enfant type12 12 hérisson voici un exemple de script de modulation vocale import { button } from 'unityengine ui'; import { zepetoscriptbehaviour } from 'zepeto script'; import { roomproperty, voicechatcontroller, voicetype } from 'zepeto voice chat'; export default class voicemodulationmanager extends zepetoscriptbehaviour { // boutons pour définir différents types de voix public buttons button\[]; start() { const voicetypes = \[ voicetype type00, voicetype type01, voicetype type05, voicetype type03, ]; for (const \[index, button] of this buttons entries()) { button onclick addlistener(() => { // définir le type de voix correspondant à l'index du bouton cliqué voicechatcontroller setvoicetype(voicetypes\[index]); }); }; // méthode appelée lorsque le système de chat vocal est initialisé voicechatcontroller oninitializedevent addlistener( init => { voicechatcontroller enterroom(new roomproperty());; } ); // méthode appelée lorsque la salle de chat vocal est connectée voicechatcontroller onroomconnectedevent addlistener( connected => { // définir le type de voix initial et activer le retour audio voicechatcontroller setvoicetype(voicetypes\[0]); voicechatcontroller enableloopback(true); } ); } // méthode pour quitter la salle de chat vocal ondestroy() { voicechatcontroller oninitializedevent removealllisteners(); voicechatcontroller onroomconnectedevent removealllisteners(); } } description du code ajoute un écouteur onclick pour chaque bouton afin de définir différents types de modulation vocale les éléments du même index dans le boutons tableau et le voicetypes tableau sont appariés lors de l'entrée dans le monde, voicechatcontroller est initialisé, et la connexion à la salle est établie automatiquement le type de modulation vocale initial est défini sur type00 , et le retour audio est activé pour entendre votre propre voix notez que pour l'invocation de setvoicetype et enableloopback , une connexion à la salle est nécessaire par conséquent, la configuration initiale est gérée dans l'écouteur de l' onroomconnectedevent changer l'emplacement de lecture audio du joueur local vous pouvez changer l'emplacement du chat vocal du joueur local en utilisant voicechatcontroller setlocalplayertransform() en utilisant cela, vous pouvez créer divers scénarios en définissant votre emplacement à un espace ou un objet spécifique lors de la conversation en chat vocal 📘 conseils la transformation du chat vocal est liée à la transformation du personnage zepeto du joueur local par conséquent, si le personnage zepeto du joueur local n'a pas été créé dans le monde, votre voix peut ne pas être transmise dans ce cas, vous pouvez utiliser le chat vocal en définissant l'emplacement de lecture de la voix dans la scène actuelle en utilisant setlocalplayertransform() api description public static setlocalplayertransform($transform unityengine transform)\ void fonction pour changer la position de lecture audio du joueur local ❗️ avertissement setlocalplayertransform() doit être appelé quelque temps après voicechatcontroller oninitializedevent(true) lorsque le chat vocal est initialisé 1\) ci dessous un exemple de script pour la fonction de changement de position de la voix voicetransformsample import { gameobject, transform, vector3 } from 'unityengine'; import { button } from 'unityengine ui'; import { zepetoscriptbehaviour } from 'zepeto script'; import { audiomode, roomproperty, voicechatcontroller } from 'zepeto voice chat'; export default class voicetransformsample extends zepetoscriptbehaviour { // bouton pour définir la transformation de la voix près public buttonclosertransform button; // bouton pour définir la transformation de la voix loin public buttonfarthertransform button; // transformation pour la position de la voix private voicetransform transform; start() { // créer un nouvel objet gameobject et assigner la transformation pour stocker l'objet de transformation de la voix const voicetransformobject = new gameobject; this voicetransform = voicetransformobject transform; // méthode appelée lorsque le système de chat vocal est initialisé voicechatcontroller oninitializedevent addlistener( init => { let roomproperty = new roomproperty(); // définir le mode audio sur audio spatial directionnel 3d roomproperty setaudiomode(audiomode directional); voicechatcontroller enterroom(roomproperty); // définir la transformation de chat vocal pour la voix du joueur local voicechatcontroller setlocalplayertransform(this voicetransform); } ); // définir la position de la transformation de la voix à (0,0,0) lorsque 'buttonclosetransform' est cliqué this buttonclosertransform onclick addlistener(()=>{ this voicetransform position = vector3 zero; }) // définir la position de la transformation de la voix à un point éloigné lorsque 'buttonfartransform' est cliqué this buttonfarthertransform onclick addlistener(()=>{ this voicetransform position = new vector3(0,0, 10); }) } // méthode pour quitter la salle de chat vocal ondestroy() { voicechatcontroller oninitializedevent removealllisteners(); voicechatcontroller onroomconnectedevent removealllisteners(); } } description du code lorsque la scène commence, créez un objet de jeu appelé voicetransformobject dans le start() fonction et enregistrez le transform dans voicetransform lorsque le chat vocal oninitialized est appelé, veuillez appliquer les paramètres suivants définissez le chat vocal en mode audio spatial 3d via setaudiomode(audiomode directional) définissez la position du chat vocal du joueur local sur voicetransform via voicechatcontroller setlocalplayertransform() buttonclosertransform définit la position de voicetransform à l'origine (0, 0, 0) lorsque le bouton est cliqué buttonfarthertransform définit la position de voicetransform à (10, 0, 0) lorsque le bouton est cliqué 2\) enregistrez le bouton sur le canvas dans la scène pour buttonclosertransform et buttonfarthertransform du composant voicetransformsample 3\) si vous l'exécutez sur votre téléphone mobile en utilisant le code qr ou le lien de test, vous pouvez vérifier ce qui suit lorsque vous appuyez sur le bouton plus près, votre voix semblera plus proche des autres lorsque vous appuyez sur le bouton plus loin, votre voix sera entendue de loin par les autres https //www youtube com/watch?v=y pj4rcshts https //www youtube com/watch?v=y pj4rcshts