CRÉEZ VOTRE MONDE
Joueurs & Personnages : Avancé
Guide de création de joueurs bot
17min
les joueurs bots sont utilisés pour combler les vides lorsqu'il n'y a pas assez de personnes pour commencer un monde multijoueur, ou lorsqu'un joueur quitte pendant un monde le comportement du joueur bot doit être implémenté pour chaque contenu ce guide décrit la méthode générale de création d'un joueur bot 📘 le guide de création du joueur bot est basé sur le guide multijoueur \[ tutoriel multijoueur docid\ vf1p1ejmzrhgtbakllyb9 ] étape 1 créer un joueur bot 1 1 ajoutez une valeur booléenne appelée isbot au schéma multijoueur 1 2 définissez la fonction ci dessous pour créer un joueur bot dans le script serveur index ts et appelez la au point désiré index ts // la méthode `createbot()` est utilisée pour créer un joueur bot avec le `userid` donné createbot(userid string) { // générer un id de session pour le joueur bot en utilisant le `userid` fourni const sessionid = "bot " + userid; // vérifier si un joueur bot avec le même id de session existe déjà si c'est le cas, retourner sans créer de doublon if (this state players has(sessionid)) { return; } // créer un nouvel objet `player` pour le joueur bot const player player = new player(); player sessionid = sessionid; if (userid) { player zepetouserid = userid; } player isbot = true; // ajouter le joueur bot à la carte des joueurs de l'état en utilisant l'id de session comme clé this state players set(player sessionid, player); this botmap set(sessionid, player); } 👍 conseils l'userid d'un utilisateur spécifique est stocké à l'avance pour que le personnage bot soit créé vous pouvez vérifier l'userid d'un utilisateur spécifique en vérifiant l'userid du client se connectant à onjoin sur le serveur après avoir écrit le script ci dessous dans le script du serveur, connectez vous depuis le monde concerné index ts onjoin(client sandboxplayer) { 	console log(client userid); } étape 2 créer un joueur bot sur le client 2 1 si vous avez le serveur qui crée un joueur bot à un moment donné, le client le reconnaîtra comme un nouveau joueur dans onjoinplayer() créer un projet > créer > zepeto > typescript et le renommer en botplayermanager ajouter une logique dans onaddedplayer() pour créer chaque joueur, et ajouter une logique pour distinguer les joueurs bots et créer leurs personnages zepeto botplayermanager ts import { zepetocharacter, zepetoplayers } from 'zepeto character controller'; import { room } from 'zepeto multiplay'; import { zepetoscriptbehaviour } from 'zepeto script' import { zepetoworldmultiplay } from 'zepeto world'; export default class botplayermanager extends zepetoscriptbehaviour { public zepetoworldmultiplay zepetoworldmultiplay; // variables privées pour stocker la salle actuelle et les données du joueur bot private room room; private botmapdata map\<string, zepetocharacter> = new map\<string, zepetocharacter>(); start() { 		 	 // écouter l'événement `roomjoined` du composant `zepetoworldmultiplay` this zepetoworldmultiplay roomjoined += (room room) => { this room = room; } 	 // écouter l'événement `onaddedplayer` de `zepetoplayers instance` pour gérer les joueurs nouvellement ajoutés zepetoplayers instance onaddedplayer addlistener((userid string) => { 	 // obtenir les données du joueur actuel à partir de l'état de la salle en utilisant le `userid` const currentplayer = this room state players get item(userid); 	 // vérifier si le joueur est un bot, et si c'est le cas, le définir comme un joueur bot if (currentplayer isbot) { this setbotplayer(currentplayer sessionid); } }); } } 2 2 écrivez la fonction setbotplayer pour ajouter des balises et des composants de synchronisation aux joueurs bots et créer des scripts pour les contrôler définissez botmapdata pour enregistrer les données des joueurs bots au format map afin de gérer les joueurs bots botplayermanager ts // la méthode `setbotplayer()` est utilisée pour définir un joueur comme un bot setbotplayer(userid string) { // obtenez le personnage zepeto associé au joueur bot en utilisant son `userid` const bot = zepetoplayers instance getplayer(userid) character; // définissez le nom du personnage sur le `userid` pour identification bot gameobject name = userid; // stockez les données du joueur bot dans la carte ` botmapdata` en utilisant son `userid` comme clé 	 this botmapdata set(userid, bot); } 👍 conseils vous pouvez ajouter des scripts ou des paramètres supplémentaires à setbotplayer() pour contrôler le comportement des joueurs bots étape 3 créez un bouton de joueur bot sur le client pour les mondes qui nécessitent un certain nombre de joueurs pour commencer, il arrive parfois qu'il n'y ait pas assez de joueurs et que vous deviez attendre longtemps que le monde commence dans ce cas, vous pouvez commencer le monde en ajoutant un joueur bot 3 1 enregistrez une fonction pour exécuter createbot() lorsque le serveur reçoit un message du client dans index ts async oncreate() { 	 // gérer le message "createbot", qui crée un joueur bot avec l'userid donné this onmessage("createbot", (client, message) => { this createbot(message); }); } 3 2 dans le script client botplayermanager ts, écrivez une fonction pour envoyer le message "createbot" au serveur la façon d'exécuter une fonction est d'envoyer un message en appuyant sur un bouton envoyez l'id utilisateur du joueur bot à créer sous forme de chaîne à travers le message botplayermanager ts public buttoncreatebot button; public botplayerid string; start() {	 	 // ajouter un écouteur de clic au bouton "create bot" pour envoyer un message pour créer un joueur bot 	 this buttoncreatebot onclick addlistener(() => { this room send("createbot", this botplayerid); }); } 3 3 maintenant, lorsque vous exécutez le serveur et le runtime, vous pouvez voir que des joueurs bots sont créés lorsque vous appuyez sur le bouton étape 4 démarrez le monde en ajoutant un joueur bot lorsqu'il n'y a pas assez de joueurs pour démarrer le monde, vous pouvez ajouter des joueurs bots pour initier le monde 4 1 dans le script du serveur, ajoutez le code suivant lors de onjoin pour vérifier le nombre de joueurs et commencer le monde lorsqu'il y a au moins quatre joueurs ajoutez une fonction pour vérifier le nombre de joueurs dans createbot() ajoutez un compteur pour le nombre de jeux dans la fonction startworld() index ts async onjoin(client sandboxplayer) { // vérifiez le nombre de joueurs dans la salle après qu'un joueur se soit joint 	this checkplayernumber(); } // la méthode `checkplayernumber()` vérifie le nombre de joueurs dans la salle et commence le monde s'il y a au moins quatre joueurs checkplayernumber() { 	// imprimez le nombre actuel de joueurs dans la salle dans la console 	console log(`nombre de joueurs, ${this state players size}`); 	// s'il y a au moins quatre joueurs dans la salle, commencez le monde 	if (this state players size >= 4) { this startworld(); 	} } // la méthode `createbot()` est utilisée pour créer un joueur bot avec le `userid` donné createbot(userid string) { 	// générez un id de session pour le joueur bot en utilisant le `userid` fourni 	const sessionid = "bot " + userid; 	// vérifiez si un joueur bot avec le même id de session existe déjà si oui, retournez sans créer de doublon if (this state players has(sessionid)) { 	return; 	} 	// créez un nouvel objet `player` pour le joueur bot 	const player player = new player(); player sessionid = sessionid; 	if (userid) { 	 player zepetouserid = userid; 	} 	player isbot = true; 	// ajoutez le joueur bot à la carte des joueurs de l'état en utilisant l'id de session comme clé 	this state players set(player sessionid, player); 	this botmap set(sessionid, player); 	// vérifiez le nombre de joueurs dans la salle après avoir ajouté le joueur bot 	this checkplayernumber(); } private playtime number = 0; // la méthode `startworld()` incrémente le temps de jeu et diffuse le message "startworld" à tous les clients startworld() { 	 this playtime += 1; // imprimez un message indiquant le début du monde et le temps de jeu actuel console log("démarrer le monde !"); this broadcast("startworld", this playtime); } sur le serveur, onjoin est exécuté lorsqu'un vrai joueur rejoint la salle donc, lorsqu'un joueur bot est créé via createbot et qu'un joueur entre via onjoin, checkplayernumber() ajoute le nombre de personnes 4 2 dans le script client, botplayermanager ts, écrivez startworld(), qui est exécuté lorsque le message startworld est reçu du serveur botplayermanager ts start() { 	// écoutez l'événement `roomjoined` du composant `zepetoworldmultiplay` 	this zepetoworldmultiplay roomjoined += (room room) => { // ajoutez un gestionnaire de message pour le type de message "startworld" 	this room addmessagehandler("startworld", (playtime number) => { this startworld(playtime); }); } // la méthode `startworld()` est appelée lorsque le monde commence avec le `playtime` fourni startworld(playtime number) { 	// imprimez le message de début du monde avec le `playtime` console log(`démarrer le monde ${playtime}`); } 4 3 au moment de l'exécution, lorsqu'il y a plus de 4 joueurs, y compris des joueurs bot, vous pouvez voir un journal appelé démarrer le monde apparaître sur la console du serveur et sur la console du client étape 5 synchroniser la position du joueur bot ci dessous un exemple de code qui déplace les joueurs bot ajoutés à la position du joueur local et synchronise la position de mouvement 5 1 tout d'abord, écrivez le code pour déplacer les joueurs bot lorsque le message movebot est reçu du client dans index ts du serveur async oncreate() { // gérer le message "movebot", qui déplace le joueur bot à la position spécifiée 	this onmessage("movebot", (client, message) => { this movebot(client, message); }); } // la méthode `movebot()` déplace le joueur bot à la position spécifiée en fonction du message reçu movebot(client sandboxplayer, message string) { // analyser le message json reçu du client pour extraire les informations de position const position = json parse(message); // créer un nouvel objet message avec l'id de session de l'utilisateur et les données de position analysées const newmessage = { user client sessionid, positionx position x, positiony position y, positionz position z } // diffuser le message "movebottoposition" à tous les clients avec les nouvelles données de message sous forme de chaîne json this broadcast("movebottoposition", json stringify(newmessage)); } 5 2 dans le script client, botplayermanager ts, écrivez sendbotposition() qui envoie la position du joueur local au serveur lorsque buttoncallbot est pressé ensuite, écrivez du code pour déplacer tous les joueurs bot vers les informations de localisation incluses dans le message lorsque le message movebottoposition est reçu du serveur botplayermanager ts public buttoncallbot button; start(){ 	// écoutez l'événement `roomjoined` du composant `zepetoworldmultiplay` this zepetoworldmultiplay roomjoined += (room room) => { this room = room; // ajoutez un gestionnaire de message pour le type de message "startworld" this room addmessagehandler("startworld", (playtime number) => { this startworld(playtime); }); 	// ajoutez un écouteur de clic au bouton "call bot" pour envoyer un message pour envoyer la position d'un joueur bot 	this buttoncallbot onclick addlistener(() => { 	 this sendbotposition(); 	}); } // cette méthode envoie la position du personnage du joueur local au serveur pour la synchronisation du mouvement des bots sendbotposition() { // obtenez la position du personnage du joueur local const localplayerposition = zepetoplayers instance localplayer zepetoplayer character transform position; // créez un objet de position contenant les coordonnées x, y et z du personnage du joueur local const position = { x localplayerposition x, y localplayerposition y, z localplayerposition z } // convertissez l'objet de position en chaîne json et envoyez le au serveur avec le type de message "movebot" this room send("movebot", json stringify(position)); } movebottoposition(message) { // analysez le message json reçu du client pour extraire les informations de position const jsonmessage = json parse(message); const position = new vector3(jsonmessage positionx, jsonmessage positiony, jsonmessage positionz); // déplacez chaque personnage bot dans la carte ` botmapdata` vers la position spécifiée avec un petit décalage aléatoire sur les axes x et z this botmapdata foreach((character zepetocharacter) => { // la méthode `movetoposition()` est utilisée pour déplacer le personnage vers la position spécifiée // ici, un petit décalage aléatoire est ajouté à la position cible pour créer un mouvement naturel pour les bots character movetoposition(position + new vector3(random range(0 5, 1), 0, random range(0 5, 1))); }); } 5 3 maintenant, si vous créez un joueur bot à l'exécution et appuyez sur le bouton buttoncallbot, vous devriez voir le joueur bot créé se déplacer vers la position du personnage du joueur local code complet de botplayermanager ts botplayermanager ts import { random, vector3 } from 'unityengine'; import { button } from 'unityengine ui'; import { zepetocharacter, zepetoplayers } from 'zepeto character controller'; import { room } from 'zepeto multiplay'; import { zepetoscriptbehaviour } from 'zepeto script' import { zepetoworldmultiplay } from 'zepeto world'; export default class botplayermanager extends zepetoscriptbehaviour { // propriétés publiques pour référencer les composants et paramètres nécessaires depuis l'inspecteur public zepetoworldmultiplay zepetoworldmultiplay; public buttoncreatebot button; public buttoncallbot button; public botplayerid string; // variables privées pour stocker la salle actuelle et les données du joueur bot private room room; private botmapdata map\<string, zepetocharacter> = new map\<string, zepetocharacter>(); start() { // écoutez l'événement `roomjoined` du composant `zepetoworldmultiplay` this zepetoworldmultiplay roomjoined += (room room) => { this room = room; // ajoutez un gestionnaire de message pour le type de message "startworld" this room addmessagehandler("startworld", (playtime number) => { this startworld(playtime); }); } // écoutez l'événement `onaddedplayer` de `zepetoplayers instance` pour gérer les joueurs nouvellement ajoutés zepetoplayers instance onaddedplayer addlistener((userid string) => { // obtenez les données du joueur actuel à partir de l'état de la salle en utilisant le `userid` const currentplayer = this room state players get item(userid); // vérifiez si le joueur est un bot, et si oui, définissez le comme un joueur bot if (currentplayer isbot) { this setbotplayer(currentplayer sessionid); } }); // ajoutez un écouteur de clic au bouton "créer bot" pour envoyer un message pour créer un joueur bot this buttoncreatebot onclick addlistener(() => { this room send("createbot", this botplayerid); }); this zepetoworldmultiplay roomjoined += (room room) => { this room = room; this room addmessagehandler("movebottoposition", (message string) => { this movebottoposition(message); }); } // ajoutez un écouteur de clic au bouton "appeler bot" pour envoyer un message pour envoyer la position d'un joueur bot this buttoncallbot onclick addlistener(() => { this sendbotposition(); }); } // la méthode `setbotplayer()` est utilisée pour définir un joueur comme un bot setbotplayer(userid string) { // obtenez le personnage zepeto associé au joueur bot en utilisant leur `userid` const bot = zepetoplayers instance getplayer(userid) character; // définissez le nom du personnage sur le `userid` pour identification bot gameobject name = userid; // stockez les données du joueur bot dans la carte ` botmapdata` en utilisant leur `userid` comme clé this botmapdata set(userid, bot); } // la méthode `startworld()` est appelée lorsque le monde commence avec le `playtime` fourni startworld(playtime number) { // imprimez le message de début du monde avec le `playtime` console log(`début du monde ${playtime}`); } // cette méthode envoie la position du personnage du joueur local au serveur pour la synchronisation du mouvement du bot sendbotposition() { // obtenez la position du personnage du joueur local const localplayerposition = zepetoplayers instance localplayer zepetoplayer character transform position; // créez un objet de position contenant les coordonnées x, y et z du personnage du joueur local const position = { x localplayerposition x, y localplayerposition y, z localplayerposition z } // convertissez l'objet de position en chaîne json et envoyez le au serveur avec le type de message "movebot" this room send("movebot", json stringify(position)); } // cette méthode est appelée lorsque le serveur reçoit le message "movebot" d'un client et déplace les personnages bots à la position spécifiée movebottoposition(message) { // analysez le message json reçu du client pour extraire les informations de position const jsonmessage = json parse(message); const position = new vector3(jsonmessage positionx, jsonmessage positiony, jsonmessage positionz); // déplacez chaque personnage bot dans la carte ` botmapdata` à la position spécifiée avec un petit décalage aléatoire sur les axes x et z this botmapdata foreach((character zepetocharacter) => { // la méthode `movetoposition()` est utilisée pour déplacer le personnage à la position spécifiée // ici, un petit décalage aléatoire est ajouté à la position cible pour créer un mouvement naturel pour les bots character movetoposition(position + new vector3(random range(0 5, 1), 0, random range(0 5, 1))); }); } } code complet du serveur index ts import { sandbox, sandboxoptions, sandboxplayer } from "zepeto multiplay"; import { datastorage } from "zepeto multiplay datastorage"; import { player, transform, vector3 } from "zepeto multiplay schema"; export default class extends sandbox { storagemap map\<string, datastorage> = new map\<string, datastorage>(); // enregistrer les données de la carte du joueur bot comme botmap private botmap map\<string, player> = new map\<string, player>(); private playtime number = 0; constructor() { super(); } oncreate(options sandboxoptions) { // appelé lorsque l'objet room est créé // gérer l'état ou l'initialisation des données de l'objet room this onmessage("onchangedtransform", (client, message) => { this state players get(client sessionid); const player = this state players get(client sessionid); const transform = new transform(); transform position = new vector3(); transform position x = message position x; transform position y = message position y; transform position z = message position z; transform rotation = new vector3(); transform rotation x = message rotation x; transform rotation y = message rotation y; transform rotation z = message rotation z; if (player) { player transform = transform; } }); this onmessage("onchangedstate", (client, message) => { const player = this state players get(client sessionid); if (player) { player state = message state; player substate = message substate; } }); // gérer le message "createbot", qui crée un joueur bot avec l'id utilisateur donné this onmessage("createbot", (client, message) => { this createbot(message); }); // gérer le message "movebot", qui déplace le joueur bot à la position spécifiée this onmessage("movebot", (client, message) => { this movebot(client, message); }); } // la méthode `createbot()` est utilisée pour créer un joueur bot avec le `userid` donné createbot(userid string) { // générer un id de session pour le joueur bot en utilisant le `userid` fourni const sessionid = "bot " + userid; // vérifier si un joueur bot avec le même id de session existe déjà si oui, retourner sans créer de doublon if (this state players has(sessionid)) { return; } // créer un nouvel objet `player` pour le joueur bot const player player = new player(); player sessionid = sessionid; if (userid) { player zepetouserid = userid; } player isbot = true; // ajouter le joueur bot à la carte des joueurs de l'état en utilisant l'id de session comme clé this state players set(player sessionid, player); this botmap set(sessionid, player); // vérifier le nombre de joueurs dans la salle après avoir ajouté le joueur bot this checkplayernumber(); } // la méthode `checkplayernumber()` vérifie le nombre de joueurs dans la salle et démarre le monde s'il y a au moins quatre joueurs checkplayernumber() { // imprimer le nombre actuel de joueurs dans la salle dans la console console log(`nombre de joueurs, ${this state players size}`); // s'il y a au moins quatre joueurs dans la salle, démarrer le monde if (this state players size >= 4) { this startworld(); } } // la méthode `startworld()` incrémente le temps de jeu et diffuse le message "startworld" à tous les clients startworld() { this playtime += 1; // imprimer un message indiquant le début du monde et le temps de jeu actuel console log("démarrer le monde !"); this broadcast("startworld", this playtime); } // la méthode `movebot()` déplace le joueur bot à la position spécifiée en fonction du message reçu movebot(client sandboxplayer, message string) { // analyser le message json reçu du client pour extraire les informations de position const position = json parse(message); // créer un nouvel objet message avec l'id de session de l'utilisateur et les données de position analysées const newmessage = { user client sessionid, positionx position x, positiony position y, positionz position z } // diffuser le message "movebottoposition" à tous les clients avec les nouvelles données de message sous forme de chaîne json this broadcast("movebottoposition", json stringify(newmessage)); } async onjoin(client sandboxplayer) { // créer l'objet joueur défini dans schemas json et définir la valeur initiale console log(`\[onjoin] sessionid ${client sessionid}, hashcode ${client hashcode}, userid ${client userid}`) const player = new player(); player sessionid = client sessionid; if (client hashcode) { player zepetohash = client hashcode; } if (client userid) { player zepetouserid = client userid; } // \[datastorage] chargement de datastorage du joueur entré const storage datastorage = client loaddatastorage(); this storagemap set(client sessionid, storage); let visit cnt = await storage get("visitcount") as number; if (visit cnt == null) visit cnt = 0; console log(`\[onjoin] le nombre de visites de ${client sessionid} ${visit cnt}`) // \[datastorage] mettre à jour le nombre de visites du joueur et ensuite enregistrer le stockage await storage set("visitcount", ++visit cnt); // gérer l'objet player en utilisant sessionid, une valeur clé unique de l'objet client // le client peut vérifier les informations sur l'objet joueur ajouté par set en ajoutant l'événement add onadd à l'objet players this state players set(client sessionid, player); // vérifier le nombre de joueurs dans la salle après qu'un joueur ait rejoint this checkplayernumber(); } ontick(deltatime number) void { // il est appelé de manière répétée à chaque heure définie sur le serveur, et un événement d'intervalle spécifique peut être géré en utilisant deltatime } async onleave(client sandboxplayer, consented? boolean) { // en définissant allowreconnection, il est possible de maintenir la connexion pour le circuit, mais de nettoyer immédiatement dans le guide de base // le client peut vérifier les informations sur l'objet joueur supprimé en ajoutant l'événement add onremove à l'objet players this state players delete(client sessionid); } }