CRÉEZ VOTRE MONDE
Économie
Mannequin ZEPETO
33min
zepeto mannequin est une api de mannequin qui permet d'essayer et de vendre des vêtements vous pourrez vendre les vêtements que vous avez fabriqués dans le monde vous pouvez créer un mannequin portant le costume d'un pnj de zepeto vous pouvez acheter des vêtements en interagissant avec des mannequins ou des objets étape 1 installer window → package manager → et installez d'abord zepeto world package 1 21 15 ou supérieur après cela, veuillez installer le package zepeto module 1 0 8 ❗️ attention dans le cadre de l'amélioration des performances, le package autonome a été intégré aux packages zepeto module 1 0 8 et versions ultérieures veuillez supprimer tous les packages zepeto mannequin précédemment installés après avoir supprimé les packages existants, veuillez installer le package zepeto module version 1 0 8 ou plus récente étape 2 vérifier l'identification de l'article à placer sur le mannequin 👍 comment vérifier l'identifiant d'un article vous pouvez vérifier l'url qui apparaît lorsque vous cliquez sur le produit de l'article dans zepeto studio copiez l'id de l'élément sous la forme d'un nombre aléatoire, collez le dans l'éditeur unity et collez « cr » devant 📘 if it's your first time making an item, please refer to the following guide \[ create your item ] étape 3 mise en place du mannequin les objets mannequins peuvent être produits de trois manières au total ❗️ attention seuls les articles que vous avez fabriqués et commercialisés peuvent être mis en place et vendus dans world with zepeto mannequin les articles qui ont été rejetés lors de l'examen ne peuvent pas être vendus par conséquent, vous devez être connecté à unity pour pouvoir utiliser cette fonctionnalité lorsque vous publiez un paquet avec la fonction mannequin, vous devez également être connecté en tant qu'éditeur lors de l'utilisation de mannequins de modèle zepeto ou de type de modèle zepeto, le nombre de mannequins peut consommer autant de ressources que le nombre de caractères zepeto saisis, ce qui peut affecter l'optimisation si vous devez placer de nombreux mannequins en forme de personnages zepeto dans le monde, nous vous recommandons de sélectionner un mannequin de type simple et d'utiliser zepeto basemodel https //studio zepeto me/console/download/652892d3a80a9f5505ed888f comme objet étape 3 1 type simple c'est le plus simple des objets spécifiques peuvent être ajoutés en tant qu'enfants mannequins pour définir l'apparence ajoute un objet avec lequel interagir le collisionneur doit être ajouté afin d'interagir avec l'objet istrigger doit être vérifié s'il n'est pas vérifié, il est automatiquement traité pour être reconnu comme un déclencheur lorsque vous essayez d'ajouter un composant mannequin sans ajouter de collisionneur, une fenêtre d'avertissement apparaît comme indiqué ci dessous ajouter des éléments de mannequin à l'objet veuillez définir les éléments suivants dans l'inspecteur icône l'icône du cintre est affichée par défaut vous pouvez la remplacer par une icône personnalisée position de l'icône si elle n'est pas présente, l'icône apparaît par défaut dans la position de l'objet avec le composant mannequin saisissez la valeur après avoir ajouté l'objet de position pour qu'il apparaisse à l'endroit souhaité ids veuillez indiquer l'identifiant de l'article que vous souhaitez vendre ajouter un objet vide et écrire le nom de l'objet comme mannequinscript ajouter zepeto > ; typescript et écrire le nom du script comme mannequinscript remplissez le comme suit import { zepetoscriptbehaviour } from 'zepeto script'; import { zepetoplayers, spawninfo } from 'zepeto character controller'; import { worldservice } from 'zepeto world'; import { itemcontentsrequest, mannequin, mannequincomponent, mannequininteractable, mannequinpreviewer } from 'zepeto mannequin'; import { object } from 'unityengine'; export default class mannequinscript extends zepetoscriptbehaviour { private previewer mannequinpreviewer; start() { // code that creates a zepeto character based on the logged in id // zepetoplayers instance createplayerwithuserid(worldservice userid, spawninfo default, true); zepetoplayers instance onaddedlocalplayer addlistener(() => { const character = zepetoplayers instance localplayer zepetoplayer character; // add mannequin interactable component character gameobject addcomponent\<mannequininteractable>(); }); // find all mannequin components const mannequins = object findobjectsoftype\<mannequincomponent>(); mannequins foreach(m => { // enter the collider m onactive addlistener(contents => { mannequin openui(contents); const zepetocontext = zepetoplayers instance localplayer zepetoplayer character context; this previewer = new mannequinpreviewer(zepetocontext, contents); this previewer previewcontents(); }); // exit the collider m oncancel addlistener(() => { mannequin closeui(); this previewer? resetcontents(); }); }); } } après avoir ajouté le script à l'objet, appuyez sur le bouton \[▶︎(play)] pour l'exécuter étape 3 2 type de modèle zepeto vous pouvez définir l'apparence d'un mannequin en ajoutant un id d'objet au pnj du personnage zepeto create an empty object and name it as mannequin le collisionneur doit être ajouté afin d'interagir avec l'objet istrigger doit être vérifié s'il n'est pas vérifié, il est automatiquement traité pour être reconnu comme un déclencheur ajouter des éléments de mannequin à l'objet veuillez définir les éléments suivants dans l'inspecteur icône l'icône du cintre est affichée par défaut vous pouvez la remplacer par une icône personnalisée position de l'icône si elle n'est pas présente, l'icône apparaît par défaut dans la position de l'objet avec le composant mannequin saisissez la valeur après avoir ajouté l'objet de position pour qu'il apparaisse à l'endroit souhaité ids veuillez indiquer l'identifiant de l'article que vous souhaitez vendre pose vous pouvez choisir une pose et la configurer à l'avenir, nous fournirons la pose souhaitée sous la forme d'un identifiant de pose 👍 si vous avez déjà un script de mannequin dans votre scène, vous pouvez sauter les étapes suivantes ajouter un objet vide et écrire le nom de l'objet comme mannequinscript ajouter zepeto > ; typescript et écrire le nom du script comme mannequinscript remplissez le comme suit import { zepetoscriptbehaviour } from 'zepeto script'; import { zepetoplayers, spawninfo } from 'zepeto character controller'; import { worldservice } from 'zepeto world'; import { itemcontentsrequest, mannequin, mannequincomponent, mannequininteractable, mannequinpreviewer } from 'zepeto mannequin'; import { object } from 'unityengine'; export default class mannequinscript extends zepetoscriptbehaviour { private previewer mannequinpreviewer; start() { // code that creates a zepeto character based on the logged in id // zepetoplayers instance createplayerwithuserid(worldservice userid, spawninfo default, true); zepetoplayers instance onaddedlocalplayer addlistener(() => { const character = zepetoplayers instance localplayer zepetoplayer character; // add mannequin interactable component character gameobject addcomponent\<mannequininteractable>(); }); // find all mannequin components const mannequins = object findobjectsoftype\<mannequincomponent>(); mannequins foreach(m => { // enter the collider m onactive addlistener(contents => { mannequin openui(contents); const zepetocontext = zepetoplayers instance localplayer zepetoplayer character context; this previewer = new mannequinpreviewer(zepetocontext, contents); this previewer previewcontents(); }); // exit the collider m oncancel addlistener(() => { mannequin closeui(); this previewer? resetcontents(); }); }); } } après avoir ajouté le script à l'objet, appuyez sur le bouton \[▶︎(play)] pour l'exécuter step 3 3 zepeto template type if you input a zepeto id, the clothes that the person is wearing will appear as mannequin however, if it is not the clothes you made, the clothes will not be shown create an empty object and name it as mannequin le collisionneur doit être ajouté afin d'interagir avec l'objet istrigger doit être vérifié s'il n'est pas vérifié, il est automatiquement traité pour être reconnu comme un déclencheur ajouter des éléments de mannequin à l'objet veuillez définir les éléments suivants dans l'inspecteur icône l'icône du cintre est affichée par défaut vous pouvez la remplacer par une icône personnalisée position de l'icône si elle n'est pas présente, l'icône apparaît par défaut dans la position de l'objet avec le composant mannequin saisissez la valeur après avoir ajouté l'objet de position pour qu'il apparaisse à l'endroit souhaité zepeto id please enter a zepeto id pose vous pouvez choisir une pose et la configurer à l'avenir, nous fournirons la pose souhaitée sous la forme d'un identifiant de pose 👍 si vous avez déjà un script de mannequin dans votre scène, vous pouvez sauter les étapes suivantes ajouter un objet vide et écrire le nom de l'objet comme mannequinscript ajouter zepeto > ; typescript et écrire le nom du script comme mannequinscript remplissez le comme suit import { zepetoscriptbehaviour } from 'zepeto script'; import { zepetoplayers, spawninfo } from 'zepeto character controller'; import { worldservice } from 'zepeto world'; import { itemcontentsrequest, mannequin, mannequincomponent, mannequininteractable, mannequinpreviewer } from 'zepeto mannequin'; import { object } from 'unityengine'; export default class mannequinscript extends zepetoscriptbehaviour { private previewer mannequinpreviewer; start() { // code that creates a zepeto character based on the logged in id // zepetoplayers instance createplayerwithuserid(worldservice userid, spawninfo default, true); zepetoplayers instance onaddedlocalplayer addlistener(() => { const character = zepetoplayers instance localplayer zepetoplayer character; // add mannequin interactable component character gameobject addcomponent\<mannequininteractable>(); }); // find all mannequin components const mannequins = object findobjectsoftype\<mannequincomponent>(); mannequins foreach(m => { // enter the collider m onactive addlistener(contents => { mannequin openui(contents); const zepetocontext = zepetoplayers instance localplayer zepetoplayer character context; this previewer = new mannequinpreviewer(zepetocontext, contents); this previewer previewcontents(); }); // exit the collider m oncancel addlistener(() => { mannequin closeui(); this previewer? resetcontents(); }); }); } } après avoir ajouté le script à l'objet, appuyez sur le bouton \[▶︎(play)] pour l'exécuter étape 4 utilisation des achats de mannequins si vous avez correctement paramétré le mannequin, une icône d'interaction apparaît lorsque vous entrez dans la zone de collision de l'objet mannequin lorsque vous cliquez sur l'icône, la fenêtre d'achat apparaît avec l'article que vous avez placé dans le mannequin vous pouvez l'essayer en cliquant sur l'article lorsque vous quittez la zone de collision de l'objet mannequin, l'essayage est annulé et vous retrouvez votre tenue d'origine voici comment se déroule le processus d'achat selon le scénario de test environnement de test processus d'achat achat à partir de l'éditeur unity pendant le jeu, la tenue sera changée si l'achat est réussi cependant, à la fin de la partie, elle reviendra à son état d'origine achats dans l'environnement de test du code qr mobile étant donné que vous vous connectez au serveur réel pour tester, les vêtements seront changés une fois l'achat réussi et les vêtements changés seront conservés lorsque vous quitterez le monde de plus, si l'achat est réussi, l'article sera acheté sur le serveur réel, donc les zems détenus par le compte réel seront déduits et vous aurez l'article de costume les vêtements achetés ne peuvent pas être jetés ou supprimés arbitrairement, veuillez donc acheter soigneusement lors des tests achat après avoir enregistré le paquet sur zepeto studio et s'être connecté via le lien de test étant donné que vous vous connectez au serveur réel pour tester, les vêtements seront changés une fois l'achat réussi et les vêtements changés seront conservés lorsque vous quitterez le monde de plus, si l'achat est réussi, l'article sera acheté sur le serveur réel, donc les zems détenus par le compte réel seront déduits et vous aurez l'article de costume les vêtements achetés ne peuvent pas être jetés ou supprimés arbitrairement, veuillez donc acheter soigneusement lors des tests étape 5 synchronisation multijoueurs du mannequin le mode multijoueur nécessite de synchroniser les costumes portés par les autres joueurs à l'aide de la fonction mannequin 👍 la configuration de base du mode multijoueur doit être terminée avant d'aborder le contenu ci dessous ajouter un script client ajouter zepeto > ; typescript et écrire le nom du script comme mannequincontroller remplir comme indiqué ci dessous import { zepetoscriptbehaviour } from 'zepeto script'; import { room } from 'zepeto multiplay'; import { clothespreviewer, itemcontent, itemcontentsrequest, mannequin, mannequincomponent, mannequininteractable, mannequinpreviewer } from 'zepeto mannequin'; import { zepetocontext } from 'zepeto'; import { zepetoplayer, zepetoplayers } from 'zepeto character controller'; import { gameobject, object, canvas, waitforsecondsrealtime, layermask } from 'unityengine'; import { player } from 'zepeto multiplay schema'; import { zepetoworldmultiplay } from 'zepeto world'; class characteritem { property string; id string; } class changeditem { sessionid string; characteritems characteritem\[]; } export default class mannequincontroller extends zepetoscriptbehaviour { private message type = { onchangeditem "onchangeditem", syncchangeditem "syncchangeditem", checkchangeditem "checkchangeditem" } private multiplay zepetoworldmultiplay; private room room; private previewer mannequinpreviewer private context zepetocontext private userzepetocontexts map\<string, zepetocontext> = new map\<string, zepetocontext>(); private currentmannequincomponent mannequincomponent = null; private selectmannequincomponent mannequincomponent = null; private isopenmannequinui boolean = false; private basicclothstring = "basiccloth" as const; start() { this multiplay = object findobjectoftype\<zepetoworldmultiplay>(); mannequin onopenedshopui addlistener((item) => { // when you click openshopbutton this openedshopui(item) }); mannequin onclosedshopui addlistener(() => { // when you click closeshopbutton this closedshopui() }); mannequin onselecteditem addlistener((itemcontent itemcontent, select boolean) => { // action when item is selected }); zepetoplayers instance onaddedlocalplayer addlistener(() => { const myplayer = zepetoplayers instance localplayer zepetoplayer; // mannequin const character = myplayer character; character gameobject addcomponent\<mannequininteractable>(); console log("local context set"); this context = character context; const mannequins = object findobjectsoftype\<mannequincomponent>() mannequins foreach(mannequin => { // when you enter mannequin collider mannequin onactive addlistener(contents => { if (this currentmannequincomponent != null && this currentmannequincomponent == mannequin) { return; } if (contents == null || contents length == 0) { console log("no mannequin data"); return; } if (this isopenmannequinui) { this breakmannequin(); } this selectmannequincomponent = mannequin; mannequin openui(contents); console log("onactive"); }); // \[option] when you leave mannequin collider mannequin oncancel addlistener( () => { if (this currentmannequincomponent == null || this currentmannequincomponent != mannequin) { return; } this breakmannequin(); console log("oncancel"); }); let iconcanvas = mannequin gameobject getcomponentinchildren\<canvas>(true); if (iconcanvas != null) { iconcanvas gameobject layer = layermask nametolayer("ui"); } }); }); zepetoplayers instance onaddedplayer addlistener((sessionid string) => { if (zepetoplayers instance getplayer(sessionid) islocalplayer) { return; } const usercontext = zepetoplayers instance getplayer(sessionid) character context; this userzepetocontexts set(sessionid, usercontext); this room send(this message type checkchangeditem, sessionid); }); this multiplay roomjoined += (room room) => { this room = room; this addmessagehandler(); }; } private addmessagehandler() { // \[option] synchronize each player's clothes this room addmessagehandler\<changeditem>(this message type syncchangeditem, message => { console log("syncchangeditem"); if (message == null) { return; } if (false == this userzepetocontexts has(message sessionid)) { return; } let itemcontents itemcontent\[] = \[]; for (const characteritem of message characteritems) { let itemcontent itemcontent = new itemcontent(); itemcontent id = characteritem id; itemcontent property = parseint(characteritem property); if (itemcontent id == this basicclothstring) { itemcontent id = ""; } itemcontents push(itemcontent); } let clothespreviewer\ clothespreviewer = new clothespreviewer(this userzepetocontexts get(message sessionid),itemcontents); clothespreviewer previewcontents(); }); } private closedshopui() { this currentmannequincomponent = null; this isopenmannequinui = false; } private openedshopui(items itemcontent\[]) { this isopenmannequinui = true; this currentmannequincomponent = this selectmannequincomponent; this previewer = new mannequinpreviewer(this context, items); this previewer onchanged addlistener((changevalues) => { let characteritems characteritem\[] = \[]; for (const changevalue of changevalues) { let characteritem characteritem = new characteritem(); characteritem id = changevalue id; characteritem property = changevalue property tostring(); if (characteritem id == "") { characteritem id = this basicclothstring; } characteritems push(characteritem); } this room send(this message type onchangeditem, characteritems); }); this previewer previewcontents(); } public breakmannequin() { mannequin closeui(); if (this previewer) { this previewer resetcontents(); this previewer = null; } this currentmannequincomponent = null; this isopenmannequinui = false; } } créer une hiérarchie > ; objet vide et le nommer mannequin controller ajoutez le script que vous venez d'écrire au mannequin controller ensuite, écrivez le code du serveur en vous référant au contenu ci dessous dans world multiplay > ; index ts import { sandbox, sandboxoptions, sandboxplayer } from 'zepeto multiplay'; import { player, transform, vector3 } from 'zepeto multiplay schema'; class characteritem { property string; id string; } class changeditem { sessionid string; characteritems characteritem\[]; } enum cloth { top = "19", bottom = "20" , dress = "22" } export default class extends sandbox { private message type = { onchangeditem "onchangeditem", syncchangeditem "syncchangeditem", checkchangeditem "checkchangeditem" } // map\<sessionid, map\<characteritem property, characteritem id>> private changeditems map\<string, map\<string, string>>; oncreate(options sandboxoptions) { // called when the room object is created // handle the state or data initialization of the room object this onmessage("onchangedtransform", (client, message) => { 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; player transform = transform; }); this onmessage("onchangedstate", (client, message) => { const player = this state players get(client sessionid); player state = message state; player substate = message substate; // character controller v2 }); // mannequin server code this changeditems = new map\<string, map\<string, string>>(); this onmessage\<characteritem\[]>(this message type onchangeditem, (client, message) => { // overwrite clothes and set new parts if (this changeditems has(client userid)) { const changeditemmap = this changeditems get(client userid); for (const characteritem of message) { if (characteritem property == cloth dress) { // in the case of a dress (22), remove the top (19) and bottom (20) if (changeditemmap has(cloth top)) { changeditemmap delete(cloth top); } if (changeditemmap has(cloth bottom)) { changeditemmap delete(cloth bottom); } } else if (characteritem property == cloth top || characteritem property == cloth bottom) { // remove the dress if it is a top (19) or bottom (20) if (changeditemmap has(cloth dress)) { changeditemmap delete(cloth dress); } } changeditemmap set(characteritem property,characteritem id); console log(`onchangeditem old ${client userid} ${characteritem property} // ${characteritem id}`); } } else { // initial registration let changeditemmap map\<string,string> = new map\<string, string>(); for (const characteritem of message) { changeditemmap set(characteritem property,characteritem id); } this changeditems set(client sessionid,changeditemmap); } let changeditem changeditem = new changeditem(); changeditem sessionid = client sessionid; changeditem characteritems = message; console log(`onchangeditem ${changeditem sessionid}`); for (const characteritem of changeditem characteritems) { console log(` ${characteritem property} ${characteritem id} `); } this broadcast(this message type syncchangeditem, changeditem, {except client}); }); this onmessage\<string>(this message type checkchangeditem,(client, message) => { if (false == this changeditems has(message)) { return; } let changeditem changeditem = new changeditem(); changeditem sessionid = client sessionid; changeditem characteritems = \[]; for (const property of this changeditems get(message) keys()) { let characteritem characteritem = new characteritem(); characteritem property = property; characteritem id = this changeditems get(message) get(property); changeditem characteritems push(characteritem); } client send\<changeditem>(this message type syncchangeditem, changeditem ); }); } onjoin(client sandboxplayer) { // create the player object defined in schemas json and set the initial value console log(`\[onjoin] sessionid ${client sessionid}, hashcode ${client hashcode}, userid ${client userid}`) const player = new player(); player sessionid = client sessionid; if (client userid) { player zepetouserid = client userid; } // manage the player object using sessionid, a unique key value of the client object // the client can check the information about the player object added by set by adding the add onadd event to the players object this state players set(client sessionid, player); } async onleave(client sandboxplayer, consented? boolean) { // by setting allowreconnection, it is possible to maintain connection for the circuit, but clean up immediately in the basic guide // the client can check the information about the deleted player object by adding the add onremove event to the players object this state players delete(client sessionid); if (this changeditems has(client sessionid)) { this changeditems delete(client sessionid); } } } activez le serveur multijoueur et testez le fonction de l'événement la fonction événement est disponible à partir de zepeto mannequin 1 1 0 zepeto mannequin mannequin fonction description public static onselecteditem unityengine events unityevent$2\<itemcontent, boolean>; appelé lorsqu'un article spécifique est sélectionné dans la fenêtre d'achat du costume de mannequin, et que le contenu de l'article sélectionné (itemcontent) et la sélection de l'article sont transférés vers la valeur booléenne public static onsucceededpurchaseitems unityengine events unityevent$1\<itemcontent\[]>; appelé lorsque l'achat de vêtements est terminé et que la liste itemcontent des informations sur les articles achetés est transférée public static onfailedpurchaseitems unityengine events unityevent$1\<itemcontent\[]>; appelé lorsque l'achat d'un vêtement a échoué et que la liste itemcontent des informations relatives à l'article échoué est reprise public static onapplieditems unityengine events unityevent$1\<itemcontent\[]>; appelé lorsque vous choisissez de porter l'article que vous avez acheté après l'achat réussi du vêtement, et la liste itemcontent des informations sur l'article que vous avez porté sera affichée public static onopenedshopui unityengine events unityevent$1\<itemcontent\[]>; appelé lorsque la fenêtre d'achat du costume de mannequin est ouverte et que la liste itemcontent des informations sur l'article dans la fenêtre d'achat est transférée public static onclosedshopui unityengine events unityevent; appelé lorsque la fenêtre d'achat du costume de mannequin est fermée zepeto mannequin basepreviewer fonction description public onchanged unityengine events unityevent$1\<zepeto mannequin basepreviewer changedvalue\[]>; elle est toujours appelée lorsque les informations sur l'objet équipé sont modifiées en appuyant sur le mannequin, et que la liste onchagedvalue est reprise les informations sur les variables membres de la classe onchagedvalue sont les suivantes propriété publique zepetopropertyflag informations sur les pièces d'habillement public id string id de l'article mannequin worldcamera si mannequin worldcamera n'est pas défini, la caméra de l'icône d'interaction avec le mannequin sera définie comme une caméra à faible profondeur si vous souhaitez définir une caméra spécifique, vous pouvez utiliser mannequin worldcamera pour en désigner une variable description mannequin worldcamera une variable qui vous permet de régler manuellement la caméra pour l'icône d'interaction avec le mannequin voici un exemple de paramétrage de mannequin worldcamera sur un mannequinscript existant import { zepetoscriptbehaviour } from 'zepeto script'; import { zepetoplayers, spawninfo } from 'zepeto character controller'; import { worldservice } from 'zepeto world'; import { itemcontentsrequest, mannequin, mannequincomponent, mannequininteractable, mannequinpreviewer } from 'zepeto mannequin'; import { object } from 'unityengine'; export default class mannequinscript extends zepetoscriptbehaviour { private previewer mannequinpreviewer; start() { // code that creates a zepeto character based on the logged in id // zepetoplayers instance createplayerwithuserid(worldservice userid, spawninfo default, true); zepetoplayers instance onaddedlocalplayer addlistener(() => { const character = zepetoplayers instance localplayer zepetoplayer character; // add mannequin interactable component character gameobject addcomponent\<mannequininteractable>(); // code to set up the mannequin icon world canvas camera as the zepeto camera mannequin worldcamera = zepetoplayers instance localplayer zepetocamera camera; }); // find all mannequin components const mannequins = object findobjectsoftype\<mannequincomponent>(); mannequins foreach(m => { // enter the collider m onactive addlistener(contents => { mannequin openui(contents); const zepetocontext = zepetoplayers instance localplayer zepetoplayer character context; this previewer = new mannequinpreviewer(zepetocontext, contents); this previewer previewcontents(); }); // exit the collider m oncancel addlistener(() => { mannequin closeui(); this previewer? resetcontents(); }); }); } } oncontentsloaded api a callback has been added that is triggered when all clothing items are fully loaded while using the mannequin api to equip clothing items public oncontentsloaded unityengine events unityevent$1\<zepeto mannequin basepreviewer changedvalue\[]>; an example of setting oncontentsloaded in the existing mannequinscript is as follows import { zepetoscriptbehaviour } from 'zepeto script'; import { zepetoplayers, spawninfo } from 'zepeto character controller'; import { worldservice } from 'zepeto world'; import { itemcontentsrequest, mannequin, mannequincomponent, mannequininteractable, mannequinpreviewer } from 'zepeto mannequin'; import { object } from 'unityengine'; export default class mannequinscript extends zepetoscriptbehaviour { private previewer mannequinpreviewer; start() { // code that creates a zepeto character based on the logged in id // zepetoplayers instance createplayerwithuserid(worldservice userid, spawninfo default, true); zepetoplayers instance onaddedlocalplayer addlistener(() => { const character = zepetoplayers instance localplayer zepetoplayer character; // add mannequin interactable component character gameobject addcomponent\<mannequininteractable>(); }); // find all mannequin components const mannequins = object findobjectsoftype\<mannequincomponent>(); mannequins foreach(m => { // enter the collider m onactive addlistener(contents => { mannequin openui(contents); const zepetocontext = zepetoplayers instance localplayer zepetoplayer character context; this previewer = new mannequinpreviewer(zepetocontext, contents); // adding listener to oncontentsloaded event this previewer oncontentsloaded addlistener((changedvalues)=>{ console log('contents loaded ', changedvalues); }); this previewer previewcontents(); }); // exit the collider m oncancel addlistener(() => { mannequin closeui(); this previewer? resetcontents(); }); }); } }