สร้างโลกของคุณเอง
เศรษฐกิจ
สร้างรายได้จากโลกของคุณ! การตั้งค่าผลิตภัณฑ์และสกุลเงิน
32นาที
zepeto mannequin คือแพ็กเกจ api หุ่นที่รองรับฟังก์ชันลองสวมใส่ / ซื้อคอสตูม ทำให้สามารถขายไอเทมคอสตูมที่ตัวเองสร้างและเผยแพร่ใน world ได้ สามารถสร้างให้หุ่นสวมคอสตูมที่กำหนดบน npc ตัวละคร zepeto ได้ สามารถซื้อไอเทมคอสตูมได้จากการมีปฏิกิริยากับหุ่นหรือวัตถุ step 1 ติดตั้ง window → package manager → และติดตั้ง zepeto world package 1 21 15 หรือสูงกว่าก่อน หลังจากนั้นกรุณาติดตั้งแพ็คเกจ zepeto module 1 0 8 ❗️ คำเตือน ในส่วนของการปรับปรุงประสิทธิภาพ แพ็คเกจแบบสแตนด์อโลนได้ถูกรวมเข้ากับแพ็คเกจ zepeto module 1 0 8 และเวอร์ชันที่ใหม่กว่า โปรดลบแพ็คเกจ zepeto mannequin ที่ติดตั้งไว้ก่อนหน้านี้ หลังจากลบแพ็คเกจที่มีอยู่แล้ว โปรดติดตั้งแพ็คเกจ zepeto module เวอร์ชัน 1 0 8 หรือใหม่กว่า step 2 ตรวจสอบ id รายการที่จะตั้งค่าบนหุ่นจำลอง 👍 วิธีตรวจสอบ id ไอเทม คุณสามารถตรวจสอบ url ที่ปรากฏขึ้นเมื่อคุณคลิกที่สินค้ารายการใน zepeto studio คัดลอก id รายการในรูปแบบของตัวเลขสุ่ม วางลงใน unity editor และวาง 'cr ' ข้างหน้า 📘 หากเพิ่งสร้างไอเทมเป็นครั้งแรก กรุณาศึกษาจากแนวทางต่อไปนี้ \[ create your item ] step 3 เซ็ตหุ่น สามารถสร้างวัตถุหุ่นได้ทั้งหมด 3 วิธี ❗️ คำเตือน แพ็กเกจ zepeto mannequin สามารถใช้สำหรับเซ็ตและขายได้แค่ไอเทมที่ตัวเองสร้างและเผยแพร่ใน world เท่านั้น ไม่สามารถขายไอเทมที่ถูกตีกลับในขั้นตอนตรวจสอบได้ เพราะฉะนั้น ต้องล็อกอิน unity เท่านั้น จึงจะใช้ฟังก์ชันนี้ได้ ตอนที่เผยแพร่แพ็กเกจที่มีฟังก์ชันหุ่น ก็ต้องล็อกอิน editor ไว้เช่นกัน เมื่อใช้หุ่นของเทมเพลต zepeto หรือประเภทโมเดล zepeto จำนวนหุ่นอาจใช้ทรัพยากรมากเท่ากับจำนวนอักขระ zepeto ที่ป้อน ซึ่งอาจส่งผลต่อการปรับให้เหมาะสม หากคุณต้องการวางหุ่นจำนวนมากให้เป็นรูปร่างของตัวละคร zepeto ในโลก เราขอแนะนำให้เลือกหุ่นแบบ simple type และใช้ zepeto basemodel https //studio zepeto me/console/download/652892d3a80a9f5505ed888f เป็นวัตถุ step 3 1 simple type เป็นวิธีที่ง่ายที่สุด ซึ่งสามารถเพิ่มวัตถุที่กำหนดให้เป็น mannequin ลูก เพื่อเซ็ตลักษณะภายนอกได้ เพิ่มวัตถุที่จะโต้ตอบด้วย ต้องเพิ่ม collider ลงในวัตถุเพื่อให้มีปฏิกิริยา ต้องเช็ก istrigger หากไม่ได้เช็ก จะถูกประเมินเป็นทริกเกอร์อัตโนมัติ หากจะเพิ่ม component ทั้งที่ไม่ได้เพิ่ม collider จะมีหน้าต่างแจ้งเตือนปรากฏขึ้นดังด้านล่าง เพิ่ม conponent หุ่นลงในวัตถุ ในตัวตรวจสอบให้ตั้งค่าดังนี้ icon จะแสดงไอคอนไม้แขวนเสื้อเป็นค่าเริ่มต้น แต่สามารถเปลี่ยนเป็นไอคอนคัสตอมได้ icon position หากไม่มี ไอคอนจะปรากฏบนตำแหน่งวัตถุที่มี component หุ่นเป็นค่าเริ่มต้น เพิ่ม position object จากนั้นป้อนค่าลงไปเพื่อให้ปรากฏในตำแหน่งที่ต้องการ ids กรอก id ไอเทมคอสตูมที่ต้องการขาย เพิ่ม empty object แล้วตั้งชื่อวัตถุว่า mannequinscript zepeto > เพิ่ม typescript แล้วตั้งชื่อสคริปต์ว่า mannequinscript เขียนสคริปต์ดังด้านล่าง 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(); }); }); } } หลังจากเพิ่มสคริปต์ไปที่วัตถุแล้ว ให้กดปุ่ม \[▶︎(play)] เพื่อเรียกใช้ step 3 2 zepeto model type สามารถเพิ่ม id ไอเทมลงใน npc ตัวละคร zepeto เพื่อเซ็ตลักษณะภายนอกของหุ่นได้ สร้าง empty object แล้วตั้งชื่อว่า mannequin ต้องเพิ่ม collider ลงในวัตถุเพื่อให้มีปฏิกิริยา ต้องเช็ก istrigger หากไม่ได้เช็ก จะถูกประเมินเป็นทริกเกอร์อัตโนมัติ เพิ่ม conponent หุ่นลงในวัตถุ ในตัวตรวจสอบให้ตั้งค่าดังนี้ icon จะแสดงไอคอนไม้แขวนเสื้อเป็นค่าเริ่มต้น แต่สามารถเปลี่ยนเป็นไอคอนคัสตอมได้ icon position หากไม่มี ไอคอนจะปรากฏบนตำแหน่งวัตถุที่มี component หุ่นเป็นค่าเริ่มต้น เพิ่ม position object จากนั้นป้อนค่าลงไปเพื่อให้ปรากฏในตำแหน่งที่ต้องการ ids กรอก id ไอเทมคอสตูมที่ต้องการขาย pose สามารถเลือกโพสแล้วเซ็ตได้ ในอนาคตจะจัดโพสที่ต้องการให้ในรูปแบบ id 👍 หากคุณติดตั้งสคริปต์ mannequin ในฉากของคุณแล้ว คุณสามารถข้ามขั้นตอนต่อมาได้ เพิ่ม empty object แล้วตั้งชื่อวัตถุว่า mannequinscript zepeto > เพิ่ม typescript แล้วตั้งชื่อสคริปต์ว่า mannequinscript เขียนสคริปต์ดังด้านล่าง 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(); }); }); } } หลังจากเพิ่มสคริปต์ไปที่วัตถุแล้ว ให้กดปุ่ม \[▶︎(play)] เพื่อเรียกใช้ step 3 3 zepeto template type หากป้อน zepeto id จะมีหุ่นที่สวมชุดที่คนนั้นสวมใส่อยู่ปรากฏขึ้น แต่หากไม่ใช่ชุดที่สร้างขึ้นเองก็จะไม่ปรากฏ สร้าง empty object แล้วตั้งชื่อว่า mannequin ต้องเพิ่ม collider ลงในวัตถุเพื่อให้มีปฏิกิริยา ต้องเช็ก istrigger หากไม่ได้เช็ก จะถูกประเมินเป็นทริกเกอร์อัตโนมัติ เพิ่ม conponent หุ่นลงในวัตถุ ในตัวตรวจสอบให้ตั้งค่าดังนี้ icon จะแสดงไอคอนไม้แขวนเสื้อเป็นค่าเริ่มต้น แต่สามารถเปลี่ยนเป็นไอคอนคัสตอมได้ icon position หากไม่มี ไอคอนจะปรากฏบนตำแหน่งวัตถุที่มี component หุ่นเป็นค่าเริ่มต้น เพิ่ม position object จากนั้นป้อนค่าลงไปเพื่อให้ปรากฏในตำแหน่งที่ต้องการ zepeto id ป้อน zepeto id pose สามารถเลือกโพสแล้วเซ็ตได้ ในอนาคตจะจัดโพสที่ต้องการให้ในรูปแบบ id 👍 หากคุณติดตั้งสคริปต์ mannequin ในฉากของคุณแล้ว คุณสามารถข้ามขั้นตอนต่อมาได้ เพิ่ม empty object แล้วตั้งชื่อวัตถุว่า mannequinscript zepeto > เพิ่ม typescript แล้วตั้งชื่อสคริปต์ว่า mannequinscript เขียนสคริปต์ดังด้านล่าง 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(); }); }); } } หลังจากเพิ่มสคริปต์ไปที่วัตถุแล้ว ให้กดปุ่ม \[▶︎(play)] เพื่อเรียกใช้ step 4 ใช้ฟังก์ชันซื้อหุ่น หากเซ็ตหุ่นได้ถูกต้อง ไอคอนสำหรับมีปฏิกิริยากับหุ่นเมื่อเข้าไปในขอบเขต collider ของวัตถุหุ่นจะปรากฏขึ้น หากคลิกที่ไอคอน จะมีหน้าต่างให้ซื้อสินค้าและไอเทมที่เซ็ตไว้ในหุ่นปรากฏขึ้น สามารถลองสวมใส่ได้โดยคลิกที่ไอคอน ไอเทมที่มีอยู่แล้วจะปรากฏเป็นเครื่องหมายเช็กถูกแทนที่ราคา หากออกจากขอบเขต collider ของวัตถุหุ่น จะถูกยกเลิกการลองสวมใส่และเปลี่ยนกลับไปเป็นชุดเดิม ต่อไปเป็นรายละเอียดการดำเนินการซื้อตาม test scenario test environment การดำเนินการซื้อ ซื้อบน unity editor เมื่อซื้อได้สำเร็จระหว่าง play คอสตูมจะถูกเปลี่ยน แต่หากสิ้นสุดการ play ก็จะกลับไปเป็นดังเดิม ซื้อบน qr code mobile test environment ในกรณีนี้ เป็นการทดสอบโดยเข้าผ่านเซิร์ฟเวอร์จริง ดังนั้นเมื่อซื้อสำเร็จแล้ว คอสตูมจะถูกเปลี่ยน และแม้จะออกจาก world แล้ว คอสตูมที่เปลี่ยนก็จะยังคงอยู่ นอกจากนี้ หากการซื้อสำเร็จ รายการจะถูกซื้อจากเซิร์ฟเวอร์จริง ดังนั้นอัญมณีที่ถือโดยบัญชีจริงจะถูกหักออกและคุณจะมีรายการเครื่องแต่งกาย เสื้อผ้าที่ซื้อแล้วไม่สามารถทิ้งหรือลบทิ้งได้โดยพลการ ดังนั้นโปรดซื้ออย่างระมัดระวังเมื่อทำการทดสอบ ซื้อโดยการเข้าผ่านลิงก์ทดสอบหลังจากบันทึกแพ็กเกจลงใน zepeto studio ในกรณีนี้ เป็นการทดสอบโดยเข้าผ่านเซิร์ฟเวอร์จริง ดังนั้นเมื่อซื้อสำเร็จแล้ว คอสตูมจะถูกเปลี่ยน และแม้จะออกจาก world แล้ว คอสตูมที่เปลี่ยนก็จะยังคงอยู่ นอกจากนี้ หากการซื้อสำเร็จ รายการจะถูกซื้อจากเซิร์ฟเวอร์จริง ดังนั้นอัญมณีที่ถือโดยบัญชีจริงจะถูกหักออกและคุณจะมีรายการเครื่องแต่งกาย เสื้อผ้าที่ซื้อแล้วไม่สามารถทิ้งหรือลบทิ้งได้โดยพลการ ดังนั้นโปรดซื้ออย่างระมัดระวังเมื่อทำการทดสอบ step 5 ซิงก์ mannequin multiplay multiplay จะต้องซิงก์กับคอสตูมที่ผู้เล่นอื่นสวมใส่ผ่านการใช้ฟังก์ชันหุ่น 👍 ต้องตั้งค่า multiplay พื้นฐานให้เสร็จเรียบร้อยก่อนสร้างตามรายการด้านล่าง เพิ่มสคริปต์ client โดยเลือก zepeto > typescript จากนั้นตั้งชื่อสคริปต์ว่า mannequincontroller เขียนตามด้านล่าง 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; } } เลือก hierarchy > empty object เพื่อสร้างวัตถุ แล้วตั้งชื่อว่า mannequincontroller เพิ่มสคริปต์ที่เพิ่งสร้างลงใน mannequincontroller เขียนโค้ดเซิร์ฟเวอร์ใน 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); } } } เปิดเซิร์ฟเวอร์ multiplay เป็น on แล้วทดสอบ ฟังก์ชันอีเวนต์ สามารถใช้ฟังก์ชันอีเวนต์ได้ตั้งแต่ zepeto mannequin เวอร์ชัน 1 1 0 เป็นต้นไป zepeto mannequin mannequin การทำงาน รายละเอียด public static onselecteditem unityengine events unityevent$2\<itemcontent, boolean>; จะถูกเรียกเมื่อเลือกไอเทมที่กำหนดในหน้าต่างซื้อคอสตูมบนหุ่น itemcontent ของไอเทมที่เลือกและสถานะการเลือกไอเทมจะเปลี่ยนไปเป็นค่า boolean public static onsucceededpurchaseitems unityengine events unityevent$1\<itemcontent\[]>; จะถูกเรียกเมื่อซื้อคอสตูมสำเร็จ ลิสต์ itemcontent ของข้อมูลไอเทมที่ซื้อจะถูกย้าย public static onfailedpurchaseitems unityengine events unityevent$1\<itemcontent\[]>; จะถูกเรียกเมื่อซื้อคอสตูมไม่สำเร็จ ลิสต์ itemcontent ของข้อมูลไอเทมที่ซื้อไม่สำเร็จจะถูกย้าย public static onapplieditems unityengine events unityevent$1\<itemcontent\[]>; จะถูกเรียกใช้เมื่อเลือกว่าจะใส่ไอเทมที่ซื้อหลังจากซื้อคอสตูมสำเร็จ ลิสต์ itemcontent ของข้อมูลไอเทมที่สวมใส่จะถูกย้าย public static onopenedshopui unityengine events unityevent$1\<itemcontent\[]>; จะถูกเรียกเมื่อเปิดหน้าต่างซื้อคอสตูมบนหุ่น ลิสต์ itemcontent ของข้อมูลไอเทมในหน้าต่างซื้อจะถูกย้าย public static onclosedshopui unityengine events unityevent; จะถูกเรียกเมื่อหน้าต่างซื้อคอสตูมบนหุ่นปิด zepeto mannequin basepreviewer การทำงาน รายละเอียด public onchanged unityengine events unityevent$1\<zepeto mannequin basepreviewer changedvalue\[]>; จะถูกเรียกเสมอ หากข้อมูลไอเทมที่กำลังสวมใส่เปลี่ยนไปจากการกดที่หุ่น รวมถึงลิสต์ onchagedvalue จะถูกย้าย ข้อมูลตัวแปร class member มีดังต่อไปนี้ public property zepetopropertyflag ข้อมูลส่วนประกอบของคอสตูม public id string item id mannequin worldcamera หากไม่ตั้งค่า mannequin worldcamera ไว้ ไอคอน mannequin interaction และกล้องที่เชื่อมอยู่จะถูกจับเป็นกล้องที่มี depth ตํ่า หากต้องการตั้งค่ากล้องด้วยตนเอง สามารถใช้ mannequin worldcamera ได้ variable รายละเอียด mannequin worldcamera ตัวแปรที่ช่วยให้สามารถตั้งค่ากล้องของไอคอน mannequin interaction ด้วยตัวเองได้ ตัวอย่างการตั้งค่า mannequin worldcamera ใน mannequinscript เดิม 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(); }); }); } }