BUAT DUNIAMU
Ekonomi
ZEPETO Mannequin
33min
zepeto mannequin adalah paket api mannequin yang mendukung kemampuan untuk mencoba/menjual pakaian anda akan bisa menjual item pakaian yang anda buat di dunia anda bisa membuat mannequin yang mengenakan kostum khusus npc karakter zepeto anda bisa membeli item pakaian dengan berinteraksi dengan mannequin atau objek step 1 instal window → package manager → dan instal zepeto world package 1 21 15 atau lebih tinggi terlebih dahulu setelah itu silahkan install paket zepeto module 1 0 8 ❗️ perhatian sebagai bagian dari peningkatan kinerja, paket mandiri telah diintegrasikan ke dalam paket zepeto module 1 0 8 dan versi yang lebih baru silakan hapus semua paket zepeto mannequin yang diinstal sebelumnya setelah menghapus paket yang ada, silakan instal paket zepeto module versi 1 0 8 atau lebih baru step 2 periksa id item yang akan dipasang pada manekin 👍 cara mengetahui item id anda dapat memeriksa url yang muncul ketika anda mengklik produk item di zepeto studio salin item id dalam bentuk angka acak, tempelkan ke dalam unity editor, dan tempelkan 'cr ' di depannya 📘 jika ini adalah pertama kalinya anda membuat item, silakan mengacu pada panduan berikut \[ create your item ] step 3 mengatur mannequin objek mannequin bisa dibuat dengan tiga tahap ❗️ perhatian hanya item yang anda buat dan rilis yang bisa dipasang dan dijual di dunia dengan zepeto mannequin item yang telah ditolak pada peninjauan tidak bisa dijual karena itu, anda harus masuki ke unity untuk menggunakan fitur tersebut saat anda mempublikasikan paket dengan fungsi mannequin, anda juga harus masuk sebagai editor saat menggunakan manekin templat zepeto atau tipe model zepeto, jumlah manekin mungkin menggunakan sumber daya sebanyak jumlah karakter zepeto yang dimasukkan, sehingga dapat mempengaruhi pengoptimalan jika anda perlu menempatkan banyak manekin berbentuk karakter zepeto di dunia, kami sarankan memilih manekin tipe sederhana dan menggunakan zepeto basemodel https //studio zepeto me/console/download/652892d3a80a9f5505ed888f sebagai objeknya step 3 1 simple type merupakan yang paling dasar object spesifik bisa ditambahkan sebagai anak anak mannequin untuk mengatur penampilan tambahkan objek untuk berinteraksi collider harus ditambahkan agar bisa berinteraksi dengan object istrigger harus dicentang jika tidak, maka akan secara otomatis diproses untuk dikenali sebagai trigger saat anda mencoba menambahkan komponen mannequin tanpa menambahkan collider, jendela peringatan akan muncul seperti di bawah ini tambahkan komponen mannequin ke object di inspektur, atur seperti ini icon icon gantungan baju akan ditampilkan secara bawaan anda bisa mengubahnya ke ikon khusus icon position jika tidak ada, icon muncul di posisi object dengan komponen mannequin secara bawaan masukkan nilai setelah menambahkan object posisi untuk membuatnya muncul di lokasi yang diinginkan ids silakan isi item id dari item pakaian yang ingin anda jual tambahkan empty object dan namakan sebagai mannequinscript tambahkan zepeto>typescript dan namakan sebagai mannequinscript isi sebagai berikut 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(); }); }); } } setelah menambahkan skrip ke objek, tekan tombol \[▶︎(play)] untuk menjalankannya step 3 2 zepeto model type anda bisa mengatur penampilan mannequin dengan menambahkan item id ke npc karakter zepeto objek mannequin bisa dibuat dengan tiga tahap collider harus ditambahkan agar bisa berinteraksi dengan object istrigger harus dicentang jika tidak, maka akan secara otomatis diproses untuk dikenali sebagai trigger tambahkan komponen mannequin ke object di inspektur, atur seperti ini icon icon gantungan baju akan ditampilkan secara bawaan anda bisa mengubahnya ke ikon khusus icon position jika tidak ada, icon muncul di posisi object dengan komponen mannequin secara bawaan masukkan nilai setelah menambahkan object posisi untuk membuatnya muncul di lokasi yang diinginkan ids silakan isi item id dari item pakaian yang ingin anda jual pose anda bisa memilih pose dan mengaturnya di masa depan, kami akan menyediakan pose yang anda inginkan dalam bentuk pose id 👍 jika anda sudah menerapkan skrip manekin di adegan anda, anda dapat melewati langkah selanjutnya tambahkan empty object dan namakan sebagai mannequinscript tambahkan zepeto>typescript dan namakan sebagai mannequinscript isi sebagai berikut 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(); }); }); } } setelah menambahkan skrip ke objek, tekan tombol \[▶︎(play)] untuk menjalankannya step 3 3 zepeto template type jika anda memasukkan zepeto id, pakaian yang dipakai orang tersebut akan ditampilkan pada mannequin akan tetapi, jika itu bukan pakaian yang anda buat, maka pakaian tersebut tidak akan diperlihatkan objek mannequin bisa dibuat dengan tiga tahap collider harus ditambahkan agar bisa berinteraksi dengan object istrigger harus dicentang jika tidak, maka akan secara otomatis diproses untuk dikenali sebagai trigger tambahkan komponen mannequin ke object di inspektur, atur seperti ini icon icon gantungan baju akan ditampilkan secara bawaan anda bisa mengubahnya ke ikon khusus icon position jika tidak ada, icon muncul di posisi object dengan komponen mannequin secara bawaan masukkan nilai setelah menambahkan object posisi untuk membuatnya muncul di lokasi yang diinginkan zepeto id silakan masukkan zepeto id pose anda bisa memilih pose dan mengaturnya di masa depan, kami akan menyediakan pose yang anda inginkan dalam bentuk pose id 👍 jika anda sudah menerapkan skrip manekin di adegan anda, anda dapat melewati langkah selanjutnya tambahkan empty object dan namakan sebagai mannequinscript tambahkan zepeto>typescript dan namakan sebagai mannequinscript isi sebagai berikut 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(); }); }); } } setelah menambahkan skrip ke objek, tekan tombol \[▶︎(play)] untuk menjalankannya step 4 menggunakan pembelian mannequin jika anda sudah menyelesaikan pengaturan mannequin dengan benar, ikon akan muncul untuk berinteraksi saat anda memasuki area collider dari objek mannequin saat anda klik pada ikon, jendela pembelian akan muncul beserta item yang anda pasang di mannequin anda bisa mencobanya dengan mengklik pada item item yang sudah dimiliki akan ditandai dengan tanda centang alih alih harga saat anda meninggalkan area collider objek mannequin, percobaan pakaian akan dibatalkan dan anda akan kembali ke pakaian awal berikut adalah cara proses pembelian bekerja berdasarkan skenario tes lingkungan tes proses pembelian pembelian dari unity editor selama play, pakaian akan berubah jika pembelian berhasil akan tetapi, saat play selesai, pakaian akan kembali ke kondisi semula pembelian di lingkungan tes kode qr ponsel karena anda masuk ke server sungguhan untuk melakukan tes, pakaian akan berubah saat pembelian berhasil dan pakaian yang diubah akan dipertahankan saat anda meninggalkan dunia juga, jika pembelian berhasil, item akan dibeli dari server nyata, sehingga permata yang dipegang oleh akun nyata akan dikurangi dan anda akan memiliki item kostum pakaian yang dibeli tidak dapat dibuang atau dihapus secara sembarangan, jadi harap berhati hati saat melakukan pengujian pembelian setelah mendaftarkan paket di zepeto studio dan terhubung melalui tautan tes karena anda masuk ke server sungguhan untuk melakukan tes, pakaian akan berubah saat pembelian berhasil dan pakaian yang diubah akan dipertahankan saat anda meninggalkan dunia juga, jika pembelian berhasil, item akan dibeli dari server nyata, sehingga permata yang dipegang oleh akun nyata akan dikurangi dan anda akan memiliki item kostum pakaian yang dibeli tidak dapat dibuang atau dihapus secara sembarangan, jadi harap berhati hati saat melakukan pengujian step 5 sinkronisasi multiplayer manekin multiplay perlu mensinkronisasikan kostum yang dipakai pemain lain saat menggunakan fungsi manekin 👍 pengaturan multiplayer dasar harus diselesaikan sebelum mengerjakan konten di bawah tambahkan skrip client tambahkan zepeto > typescript dan namakan skrip sebagai mannequincontroller isi seperti yang ditampilkan berikut 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; } } buat hierarchy > empty object dan namakan mannequincontroller tambahkan skrip yang baru ditulis ke mannequincontroller selanjutnya, tulis kode server dengan mengacu pada konten di bawah di 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); } } } nyalakan server multiplayer dan tes fungsi event fungsi event tersedia dari zepeto mannequin 1 1 0 zepeto mannequin mannequin fungsi deskripsi public static onselecteditem unityengine events unityevent$2\<itemcontent, boolean>; dipanggil saat item tertentu dipilih dari jendela pembelian kostum mannequin, dan itemcontent dari informasi item yang dipilih dan pemilihan item ditransfer ke nilai boolean public static onsucceededpurchaseitems unityengine events unityevent$1\<itemcontent\[]>; dipanggil saat pembelian pakaian selesai, dan daftar temcontent informasi item yang dibeli dibawa public static onfailedpurchaseitems unityengine events unityevent$1\<itemcontent\[]>; dipanggil saat pembelian pakaian gagal, dan daftar temcontent informasi item yang gagal dibeli dibawa public static onapplieditems unityengine events unityevent$1\<itemcontent\[]>; dipanggil saat anda memilih untuk mengenakan item yang dibeli setelah pembelian berhasil, dan daftar itemcontent dari informasi item yang anda telah kenakan akan dibawa public static onopenedshopui unityengine events unityevent$1\<itemcontent\[]>; dipanggil saat jendela pembelian kostum mannequin dibuka, dan daftar temcontent informasi item di jendela pembelian dibawa public static onclosedshopui unityengine events unityevent; dipanggil saat jendela pembelian kostum mannequin ditutup zepeto mannequin basepreviewer fungsi deskripsi public onchanged unityengine events unityevent$1\<zepeto mannequin basepreviewer changedvalue\[]>; selalu dipanggil saat informasi item yang dikenakan diubah dengan menekan mannequin, dan daftar onchangedvalue dibawa informasi variabel anggota untuk kelas onchangedvalue adalah sebagai berikut public property zepetopropertyflag informasi bagian pakaian public id string item id mannequin worldcamera jika tidak mengatur mannequin worldcamera, kamera terkait dengan ikon interaksi manekin diatur menjadi kamera dengan depth rendah jika ingin mengatur kamera yang diinginkan secara terpisah, silakan gunakan mannequin worldcamera untuk menentukan pengaturan variable deskripsi mannequin worldcamera variabel untuk mengatur kamera terkait dengan ikon interaksi manekin secara langsung contoh pengaturan mannequin worldcamera pada mannequinscript yang tersedia adalah sebagai berikut 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(); }); }); } }