BUAT DUNIAMU

Isyarat

32min
api zepetoworldcontent memungkinkan anda untuk mengatur thumbnail untuk kategori gestur/pose yang diinginkan dan mengaktifkan gestur/pose tertentu ketika thumbnail diklik untuk menggunakan api zepetoworldcontent, anda harus menulis pernyataan impor sebagai berikut import { officialcontenttype, worldservice, zepetoworldcontent, content } from 'zepeto world'; informasi variabel anggota dan fungsi dari kelas konten yang berisi informasi gerakan/pose adalah sebagai berikut api deskripsi publik get id() string id unik konten publik get title() string teks judul gerakan, pose \ bahasa akan secara otomatis diterjemahkan tergantung pada bahasa perangkat publik get thumbnail() unityengine texture2d thumbnail 2d publik get animationclip() unityengine animationclip clip animasi gerakan publik get isdownloadedthumbnail() boolean fungsi untuk menentukan apakah anda telah mengunduh thumbnail ini sebelumnya publik get isdownloadedanimation() boolean fungsi untuk menentukan apakah anda telah mengunduh clip animasi ini sebelumnya publik downloadanimation($complete system action)\ void fungsi unduh clip animasi yang menerima callback selesai dengan faktor \ jika isdownloadedanimation() adalah false, implementasikan downloadanimation() untuk dipanggil publik downloadthumbnail($complete system action)\ void fungsi untuk mengunduh thumbnail \ jika isdownloadedthumbnail() adalah false, implementasikan downloadthumbnail() untuk dipanggil officialcontenttype enum tipe konten (dunia 1 9 0 dan lebih tinggi) \ gerakan = 2 \ pose = 4 \ selfie = 8 \ gesturegreeting = 16 \ gesturepose = 32 \ gestureaffirmation = 64 \ gesturedancing = 128 \ gesturedenial = 256 \ gestureetc = 512 \ semua = 14 anda dapat menggunakan fungsi yang ada, public downloadthumbnail($character zepeto character controller zepetocharacter, $complete system action)\ void , tanpa masalah terkait fungsionalitas namun, karena tidak lagi menerima karakter zepeto sebagai argumen, silakan gunakan fungsi yang baru dimodifikasi public downloadthumbnail($complete system action)\ void sebagai gantinya langkah 1 siapkan ui langkah 1 1 buat tombol gestur 1\) tambahkan hierarchy > ui > canvas dan atur urutan sortir ke 2 untuk menghindari tertutup oleh ui lainnya 2\) tambahkan hierarki > ui > tombol langkah 1 2 atur panel gestur 1\) tambahkan hierarki > buat objek kosong dan ganti namanya menjadi panelparent 2\) tambahkan hierarki > ui > panel sebagai anak dari panelparent 3\) tombol tutup setelah menambahkan ui > tombol, tambahkan event onclick untuk menonaktifkan panel gestur 4\) tombol buka silakan tambahkan event onclick yang mengaktifkan panel gestur ke tombol buka yang dibuat di atas 5\) tambahkan gambar untuk berfungsi sebagai area judul 6\) konfigurasikan tampilan gulir untuk menampilkan thumbnail gestur tambahkan hierarki > ui > tampilan gulir centang horizontal dan nonaktifkan gambar bilah gulir karena anda hanya akan menggunakan gulir vertikal dan gulir horizontal tidak akan diperlukan tambahkan tata letak grid ke konten di tampilan gulir untuk menyelaraskan thumbnail dalam pola grid tambahkan pengatur ukuran konten untuk membuat ukuran objek sesuai dengan ukuran konten ketika anda menerapkan skrip, anda harus mengatur konten di tampilan gulir sebagai induk dari thumbnail gestur (agar seluruh area dikenali dan digulir) 7\) konfigurasikan tab berdasarkan jenis gestur tambahkan hierarki > buat objek kosong sebagai anak dari panel dan ganti namanya menjadi gesturetitle ini adalah objek induk dari tombol toggle tambahkan tata letak horizontal untuk menyelaraskan tab secara horizontal tambahkan komponen grup toggle 👍 untuk mengonfigurasi lebih banyak tab, tambahkan hierarki > ui > tampilan gulir dan centang horizontal di opsi tampilan gulir 8\) tambahkan teks yang akan digunakan sebagai tombol toggle sebagai anak dari gesturetitle, dan ganti dengan semua mengatur warna teks menjadi abu abu tambahkan teks yang disorot yang akan ditampilkan saat dicentang sebagai anak dari teks atur konten font, ukuran, dan ketebalan sama, dan atur warna menjadi hitam tambahkan komponen toggle tentukan objek induk dalam grup tambahkan teks yang disorot yang anda tambahkan sebagai anak ke grafik periksa ison hanya untuk semua komponen toggle yang akan ditampilkan terlebih dahulu buat kedua tombol toggle gesture dan pose dengan cara yang sama langkah 1 3 buat prefab thumbnail gunakan metode membuat tombol thumbnail sebagai prefab dan kemudian menghasilkan sebagai instance dalam skrip 1\) tambahkan ui > tombol sebagai anak dari konten di scroll view dan ganti namanya menjadi prethumb 2\) silakan ganti namanya menjadi thumb setelah menambahkan gambar mentah gambar ini akan menjadi thumbnail sesuaikan ukuran dengan tepat 3\) tambahkan teks atur posisi untuk memusatkan bagian bawah gambar sesuaikan ukuran dan ketebalan tulisan, dan tambahkan content size fitter horizontal fit ukuran yang diutamakan vertical fit ukuran yang diutamakan 4\) jika pengaturan sudah selesai, silakan jadikan sebagai prefab dan letakkan di folder resources langkah 1 4 video panduan pengaturan ui https //www youtube com/watch?v=v ias8t8wq0 https //www youtube com/watch?v=v ias8t8wq0 👍 nilai ukuran dan posisi ui yang ditunjukkan dalam video disarankan, tetapi anda dapat memodifikasinya sesuai dengan nilai yang anda inginkan! setelah pengaturan ui selesai, lanjutkan ke scripting langkah 2 tulis skrip skrip ini berdasarkan permainan tunggal langkah 2 1 thumbnail proyek > buat > zepeto > typescript dan ganti namanya menjadi thumbnail tulis skrip contoh seperti di bawah ini ini adalah skrip yang mengatur informasi konten gerakan (judul, gambar) ke dalam ui thumbnail import { zepetoscriptbehaviour } from 'zepeto script'; import { content } from 'zepeto world'; import { rawimage, text } from 'unityengine ui'; import { texture2d } from 'unityengine'; export default class thumbnail extends zepetoscriptbehaviour { @hideininspector() public content content; start() { this getcomponentinchildren\<text>() text = this content title; this getcomponentinchildren\<rawimage>() texture = this content thumbnail as texture2d; } } setelah membuat skrip, buka prefab prethumb dan tambahkan skrip tersebut langkah 2 2 gestureloader buat hierarki > buat objek kosong dan ganti namanya menjadi gestureloader buat proyek > buat > zepeto > typescript dan ganti namanya menjadi gestureloader tulis skrip contoh seperti di bawah ini gestureloader import { zepetoscriptbehaviour } from 'zepeto script'; import { localplayer, spawninfo, zepetocharacter, zepetoplayers } from 'zepeto character controller'; import { officialcontenttype, worldservice, zepetoworldcontent, content } from 'zepeto world'; import { rawimage, text, button } from 'unityengine ui'; import { gameobject, texture2d, transform, waituntil } from 'unityengine'; import thumbnail from ' /thumbnail'; export default class gestureloader extends zepetoscriptbehaviour { @hideininspector() public contents content\[] = \[]; @hideininspector() public thumbnails gameobject\[] = \[]; @serializefield() private count number = 50; @serializefield() private contentsparent transform; @serializefield() private prefthumb gameobject; private mycharacter zepetocharacter; start() { // membuat karakter zepetoplayers instance createplayerwithuserid(worldservice userid, new spawninfo(), true); zepetoplayers instance onaddedlocalplayer addlistener(() => { this mycharacter = zepetoplayers instance localplayer zepetoplayer character; // untuk mengambil thumbnail dengan karakter saya, anda perlu meminta konten setelah karakter dibuat this contentrequest(); }); } // 1 menerima konten dari server private contentrequest() { // semua tipe permintaan zepetoworldcontent requestofficialcontentlist(officialcontenttype all, contents => { this contents = contents; for (let i = 0; i < this count; i++) { if (!this contents\[i] isdownloadedthumbnail) { // ambil foto thumbnail menggunakan karakter saya this contents\[i] downloadthumbnail(() =>{ this createthumbnailobjcet(this contents\[i]); }); } else { this createthumbnailobjcet(this contents\[i]); } } }); } // 2 membuat objek thumbnail private createthumbnailobjcet(content content) { const newthumb gameobject = gameobject instantiate(this prefthumb, this contentsparent) as gameobject; newthumb getcomponent\<thumbnail>() content = content; // listener tombol untuk setiap thumbnail newthumb getcomponent\<button>() onclick addlistener(() => { this loadanimation(content); }); this thumbnails push(newthumb); } // 3 memuat animasi private loadanimation(content content) { // verifikasi pemuatan animasi if (!content isdownloadedanimation) { // jika animasi belum diunduh, unduh itu content downloadanimation(() => { // putar klip animasi this mycharacter setgesture(content animationclip); }); } else { this mycharacter setgesture(content animationclip); } } } count adalah jumlah maksimum gerakan yang akan diunduh di setiap tab jika anda mengatur ke angka yang lebih besar dari 100, mungkin ada kesalahan selama proses pengunduhan thumbnail, jadi harap atur hanya sebanyak yang anda butuhkan skrip mengalir sebagai berikut 1\) panggil fungsi kustom contentsrequest() untuk menghasilkan thumbnail setelah memuat karakter zepeto fungsi contentsrequest() menerima informasi konten dengan memisahkan gerakan dan pose, masing masing jika ada thumbnail yang sudah ada, itu akan dilewati; jika tidak, thumbnail akan diambil data thumbnail yang diambil disimpan dalam daftar masing masing langkah 2 3 uicontroller buat hierarki > buat objek kosong dan ganti namanya menjadi uicontoller buat proyek > buat > zepeto > typescript dan ganti namanya menjadi uicontoller tulis skrip contoh seperti di bawah ini uicontroller import { zepetoscriptbehaviour } from 'zepeto script'; import { button, rawimage, text, toggle } from 'unityengine ui'; import { localplayer, zepetocharacter, zepetoplayers, zepetoscreentouchpad } from 'zepeto character controller'; import { officialcontenttype, content } from 'zepeto world'; import { object, gameobject, transform } from 'unityengine'; import gestureloader from ' /gestureloader'; import thumbnail from ' /thumbnail'; export default class uicontroller extends zepetoscriptbehaviour { @serializefield() private closebutton button; @serializefield() private typetogglegroup toggle\[]; private gesturelodaer gestureloader; private mycharacter zepetocharacter; start() { this gesturelodaer = object findobjectoftype\<gestureloader>(); zepetoplayers instance onaddedlocalplayer addlistener(() => { this mycharacter = zepetoplayers instance localplayer zepetoplayer character; // jika mengklik touchpad, batalkan gerakan object findobjectoftype\<zepetoscreentouchpad>() onpointerdownevent addlistener(() => { this stopgesture(); }); // jika mengklik tombol tutup, batalkan gerakan this closebutton onclick addlistener(() => { this stopgesture(); }); }); // pendengar ui this typetogglegroup\[0] onvaluechanged addlistener(() => { this setcategoryui(officialcontenttype all); }); this typetogglegroup\[1] onvaluechanged addlistener(() => { this setcategoryui(officialcontenttype gesture); }); this typetogglegroup\[2] onvaluechanged addlistener(() => { this setcategoryui(officialcontenttype pose); }); } // set ui kategori toggle private setcategoryui(category officialcontenttype) { if (category == officialcontenttype all) { this gesturelodaer thumbnails foreach((obj) => { obj setactive(true); }); } else { for (let i = 0; i < this gesturelodaer thumbnails length; i++) { const content = this gesturelodaer thumbnails\[i] getcomponent\<thumbnail>() content; if (content keywords includes(category)) { this gesturelodaer thumbnails\[i] setactive(true); } else { this gesturelodaer thumbnails\[i] setactive(false); } } } } private stopgesture() { this mycharacter cancelgesture(); } } alur skrip adalah sebagai berikut sentuh touchpad atau tombol tutup untuk membatalkan pemutaran menggunakan fungsi cancelgesture() ketuk tab (tombol toggle) untuk memanggil fungsi kustom setcategoryui() fungsi setcategoryui() menggunakan informasi konten gestur di setiap thumbnail untuk mengaturnya untuk setiap kategori yang sesuai aktifkan jika ini adalah jenis yang berlaku, dan nonaktifkan jika tidak setelah menyelesaikan scripting, tetapkan tombol tutup, typetogglegroup ke inspector masuk ke type toggle group adalah toggle yang merupakan anak dari toggle group di panel gestur langkah 3 jalankan ❗️ peringatan sebelum bermain, nonaktifkan panelparent agar hanya tombol buka yang terlihat saat bermain langkah 4 sinkronkan gerakan multi pemain dalam kasus multi pemain, kode sinkronisasi harus ditambahkan yang menerima nilai informasi gerakan yang diambil oleh pemain tertentu dan menerapkannya ke semua pemain yang mengakses ruangan kuncinya adalah mengirim dan menerima pesan ruangan antara server dan klien tentang pemain mana yang melakukan gerakan mana langkah 4 1 kode klien thumbnail multiplay tulis skrip yang sama seperti yang diterapkan dalam kode klien single play thumbnail multiplay import { zepetoscriptbehaviour } from 'zepeto script'; import { content } from 'zepeto world'; import { rawimage, text } from 'unityengine ui'; import { texture2d } from 'unityengine'; export default class thumbnail extends zepetoscriptbehaviour { @hideininspector() public content content; start() { this getcomponentinchildren\<text>() text = this content title; this getcomponentinchildren\<rawimage>() texture = this content thumbnail as texture2d; } } gestureloader multiplay secara default, skrip yang diterapkan dalam kode klien single play ditulis dengan cara yang sama selain itu, klien mendeklarasikan antarmuka untuk berisi playergestureinfo saat mengirim informasi anda ke server lihat sendmygesture() fungsi kustom ketika pemain anda menekan thumbnail untuk membuat gestur, kirim id gestur ke server menggunakan room send() ketika anda membatalkan gestur, proses untuk mengirim informasi bahwa anda telah membatalkan saat menerima informasi gestur dari klien lain dari server "onchangegesture" pesan ruang dikirim ke this room addmessagehandler() dalam start() sinkronisasi dicapai dengan memiliki id sesi dan id gestur dalam pesan "onchangegesture" dan membuat pemain yang sesuai memainkan gestur tersebut import { zepetoscriptbehaviour } from 'zepeto script'; import { localplayer, spawninfo, zepetocharacter, zepetoplayers } from 'zepeto character controller'; import { officialcontenttype, worldservice, zepetoworldcontent, content, zepetoworldmultiplay } from 'zepeto world'; import { rawimage, text, button } from 'unityengine ui'; import { gameobject, texture2d, transform, waituntil } from 'unityengine'; import thumbnail from ' /thumbnail'; import { room, roomdata } from 'zepeto multiplay'; interface playergestureinfo { sessionid string, gestureid string } const cancelmotion = "" as const; export default class gestureloadermultiplay extends zepetoscriptbehaviour { public multiplay zepetoworldmultiplay; @hideininspector() public contents content\[] = \[]; @hideininspector() public thumbnails gameobject\[] = \[]; @serializefield() private count number = 50; @serializefield() private contentsparent transform; @serializefield() private prefthumb gameobject; private mycharacter zepetocharacter; private room room; private contentsmap map\<string, content> = new map\<string, content>(); start() { // membuat karakter zepetoplayers instance onaddedlocalplayer addlistener(() => { this mycharacter = zepetoplayers instance localplayer zepetoplayer character; // untuk mengambil thumbnail dengan karakter saya, anda perlu meminta konten setelah karakter dibuat this contentrequest(); }); // untuk multiplay this multiplay roomcreated += (room room) => { this room = room; // menerima informasi gerakan pengguna dari server this room addmessagehandler("onchangegesture", (message playergestureinfo) => { let playergestureinfo playergestureinfo = { sessionid message sessionid, gestureid message gestureid }; this loadanimation(playergestureinfo); }); }; } // 1 menerima konten dari server private contentrequest(){ // semua tipe permintaan zepetoworldcontent requestofficialcontentlist(officialcontenttype all, contents => { this contents = contents; for (let i = 0; i < this count; i++) { if (!this contents\[i] isdownloadedthumbnail) { // mengambil foto thumbnail menggunakan karakter saya this contents\[i] downloadthumbnail(() =>{ this createthumbnailobjcet(this contents\[i]); }); } else { this createthumbnailobjcet(this contents\[i]); } } }); } // 2 membuat objek thumbnail private createthumbnailobjcet(content content) { const newthumb gameobject = gameobject instantiate(this prefthumb, this contentsparent) as gameobject; newthumb getcomponent\<thumbnail>() content = content; // membuat kamus untuk menemukan konten dengan id konten this contentsmap set(content id, content); // pendengar tombol untuk setiap thumbnail newthumb getcomponent\<button>() onclick addlistener(() => { this sendmygesture(content id); }); // daftar thumbnail this thumbnails push(newthumb); } // untuk multiplay // mengirim informasi gerakan yang diklik ke server public sendmygesture(gestureid) { const data = new roomdata(); data add("gestureid", gestureid); this room send("onchangegesture", data getobject()); } // 3 memuat animasi private loadanimation(playergestureinfo playergestureinfo){ if (!zepetoplayers instance hasplayer(playergestureinfo sessionid)) { console log("pemain tidak ada"); return; } const zepetoplayer = zepetoplayers instance getplayer(playergestureinfo sessionid) character; if (playergestureinfo gestureid == cancelmotion) { zepetoplayer cancelgesture(); return; } else if(!this contentsmap has(playergestureinfo gestureid)) { console log("sumber daya belum dimuat"); return; } const content = this contentsmap get(playergestureinfo gestureid); // verifikasi pemuatan animasi if (!content isdownloadedanimation) { // jika animasi belum diunduh, unduh itu content downloadanimation(() => { // mainkan klip animasi zepetoplayer setgesture(content animationclip); }); } else { zepetoplayer setgesture(content animationclip); } } } setelah menyelesaikan penulisan skrip, inspektur akan menetapkan objek tambahan ke multiplay dengan komponen multiplay zepeto world uicontroller multiplay secara default, skrip yang diimplementasikan dalam kode klien permainan tunggal ditulis dengan cara yang sama perbedaannya dari kode klien permainan tunggal adalah fungsi kustom stopgesture() panggil fungsi kustom sendmygesture() di dalam gestureloadermultiplay proses untuk mengirim informasi bahwa gestur telah dibatalkan import { zepetoscriptbehaviour } from 'zepeto script'; import { button, rawimage, text, toggle } from 'unityengine ui'; import { localplayer, zepetocharacter, zepetoplayers, zepetoscreentouchpad } from 'zepeto character controller'; import { officialcontenttype, content } from 'zepeto world'; import { object, gameobject, transform } from 'unityengine'; import gestureloadermultiplay from ' /gestureloadermultiplay'; import thumbnail from ' /thumbnail'; const cancelmotion = "" as const; export default class uicontroller extends zepetoscriptbehaviour { @serializefield() private closebutton button; @serializefield() private typetogglegroup toggle\[]; private gesturelodaer gestureloadermultiplay; private mycharacter zepetocharacter; start() { this gesturelodaer = object findobjectoftype\<gestureloadermultiplay>(); zepetoplayers instance onaddedlocalplayer addlistener(() => { this mycharacter = zepetoplayers instance localplayer zepetoplayer character; // jika mengklik touchpad, batalkan gerakan object findobjectoftype\<zepetoscreentouchpad>() onpointerdownevent addlistener(() => { this stopgesture(); }); // jika mengklik tombol tutup, batalkan gerakan this closebutton onclick addlistener(() => { this stopgesture(); }); }); // pendengar ui this typetogglegroup\[0] onvaluechanged addlistener(() => { this setcategoryui(officialcontenttype all); }); this typetogglegroup\[1] onvaluechanged addlistener(() => { this setcategoryui(officialcontenttype gesture); }); this typetogglegroup\[2] onvaluechanged addlistener(() => { this setcategoryui(officialcontenttype pose); }); } // set ui toggle kategori private setcategoryui(category officialcontenttype) { if (category == officialcontenttype all) { this gesturelodaer thumbnails foreach((obj) => { obj setactive(true); }); } else { for (let i = 0; i < this gesturelodaer thumbnails length; i++) { const content = this gesturelodaer thumbnails\[i] getcomponent\<thumbnail>() content; if (content keywords includes(category)) { this gesturelodaer thumbnails\[i] setactive(true); } else { this gesturelodaer thumbnails\[i] setactive(false); } } } } private stopgesture() { this gesturelodaer sendmygesture(cancelmotion); } } langkah 4 2 kode server kode server kemudian menyatakan antarmuka untuk berisi playergestureinfo dengan cara yang sama kode server didasarkan pada kode server dalam contoh multiplay secara default ini membuat callback onmessage() yang mengirimkan informasi gestur ke klien lain ketika gestur berubah dalam oncreate() import { sandbox, sandboxoptions, sandboxplayer } from 'zepeto multiplay'; import { player, transform, vector3 } from 'zepeto multiplay schema'; // definisikan antarmuka playergestureinfo untuk mewakili informasi gerakan pemain interface playergestureinfo { sessionid string, gestureid string } export default class extends sandbox { // definisikan objek konstan `message type` untuk menyimpan jenis pesan yang digunakan dalam skrip message type = { onchangegesture "onchangegesture" } oncreate(options sandboxoptions) { // dipanggil saat ruangan dibuat // tangani status atau inisialisasi data ruangan 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; // pengontrol karakter v2 }); // ketika gerakan diubah, this onmessage\<playergestureinfo>(this message type onchangegesture, (client, message) => { let gestureinfo\ playergestureinfo = { sessionid client sessionid, gestureid message gestureid }; // kirim gerakan ke pemain lain kecuali klien this broadcast(this message type onchangegesture, gestureinfo); }); } onjoin(client sandboxplayer) { // atur nilai awal setelah membuat objek pemain yang didefinisikan dalam schemas json console log(`\[onjoin] sessionid ${client sessionid}, userid ${client userid}`) const player = new player(); player sessionid = client sessionid; if (client userid) { player zepetouserid = client userid; } // kelola objek pemain menggunakan sessionid, nilai kunci unik dari objek klien // klien dapat memeriksa informasi tentang objek pemain yang ditambahkan dengan menambahkan acara add onadd ke objek pemain this state players set(client sessionid, player); } onleave(client sandboxplayer, consented? boolean) { // dengan mengatur allowreconnection, dimungkinkan untuk mempertahankan koneksi untuk sirkuit, tetapi segera membersihkan dalam panduan dasar // klien dapat memeriksa informasi tentang objek pemain yang dihapus dengan menambahkan acara add onremove ke objek pemain this state players delete(client sessionid); } }