BUAT DUNIAMU
Berinteraksi dengan Benda-bend...

Berinteraksi dengan sebuah objek

15min
terapkan tombol interaksi yang muncul ketika karakter zepeto mendekati objek langkah 1 pengaturan lingkungan anda dapat mengunduh sumber daya animasi dan tombol yang digunakan dalam contoh interaksi dan panduan dari tautan berikut 📘 contoh interaksi zepeto modul interaksi zepeto https //github com/naverz/zepeto multiplay example/tree/main/assets/zepeto%20interaction%20module terapkan kode pembuatan karakter zepeto di scene sebagai default 📘 silakan merujuk ke panduan berikut \[ zepeto player docid tvoiujhwojg5dz1vw9xw ] langkah 2 mengatur objek atur objek untuk berinteraksi dengan karakter zepeto 1\) tempatkan objek yang akan berinteraksi dengan karakter zepeto 2\) buat hierarki > buat objek kosong dan ganti namanya menjadi dockpoint ini adalah titik yang akan berinteraksi dengan karakter zepeto sesuaikan posisi objek periksa bahwa tombol toggle gizmo transform di bagian atas editor unity adalah lokal dan putar sumbu z (panah biru) ke luar objek setelah menambahkan komponen collider, periksa istrigger sesuaikan ukuran collider agar sesuai dengan jangkauan di mana pemain dapat berinteraksi dengan objek 3\) buat hierarki > buat objek kosong sebagai anak dari dockpoint dan ganti namanya menjadi iconpos langkah 3 mengatur ui 1\) buat hierarki > ui > kanvas sebagai anak dari objek yang akan berinteraksi dengan karakter zepeto dan ganti namanya menjadi preficoncanvas atur mode render ke ruang dunia atur lebar dan tinggi masing masing menjadi 1 hapus centang opsi abaikan grafik terbalik pada komponen graphic raycaster 2\) buat hierarki > ui > tombol sebagai anak dari preficoncanvas 3\) setelah pengaturan selesai, buat menjadi prefab dan hapus preficoncanvas yang tersisa di hierarki langkah 4 menulis skrip langkah 4 1 ikon interaksi 1\) buat proyek > buat > zepeto > typescript dan ganti namanya menjadi interactionicon 2\) tulis skrip contoh seperti di bawah ini import { zepetoscriptbehaviour } from 'zepeto script'; import { camera, canvas, collider, gameobject, transform, object } from 'unityengine'; import { button } from 'unityengine ui'; import { unityevent } from 'unityengine events'; import { zepetoplayers } from 'zepeto character controller'; export default class interactionicon extends zepetoscriptbehaviour { // ikon @header("\[ikon]") @serializefield() private preficoncanvas gameobject; @serializefield() private iconposition transform; // acara unity @header("\[acara unity]") public onclickevent unityevent; public ontriggerenterevent unityevent; public ontriggerexitevent unityevent; private button button; private canvas canvas; private cachedworldcamera camera; private isiconactive boolean = false; private isdonefirsttrig boolean = false; private update() { if (this isdonefirsttrig && this canvas? gameobject activeself) { this updateiconrotation(); } } private ontriggerenter(coll collider) { if (coll != zepetoplayers instance localplayer? zepetoplayer? character getcomponent\<collider>()) { return; } this showicon(); this ontriggerenterevent? invoke(); } private ontriggerexit(coll collider) { if (coll != zepetoplayers instance localplayer? zepetoplayer? character getcomponent\<collider>()) { return; } this hideicon(); this ontriggerexitevent? invoke(); } public showicon(){ if (!this isdonefirsttrig) { this createicon(); this isdonefirsttrig = true; } else { this canvas gameobject setactive(true); } this isiconactive = true; } public hideicon() { this canvas? gameobject setactive(false); this isiconactive = false; } private createicon() { if (this canvas === undefined) { const canvas = gameobject instantiate(this preficoncanvas, this iconposition) as gameobject; this canvas = canvas getcomponent\<canvas>(); this button = canvas getcomponentinchildren\<button>(); this canvas transform position = this iconposition position; } this cachedworldcamera = object findobjectoftype\<camera>(); this canvas worldcamera = this cachedworldcamera; this button onclick addlistener(() => { this onclickicon(); }); } private updateiconrotation() { this canvas transform lookat(this cachedworldcamera transform); } private onclickicon() { this onclickevent? invoke(); } } alur skrip adalah sebagai berikut perbarui() panggil fungsi kustom updateiconrotation() untuk memutar kanvas ikon agar sesuai dengan rotasi kamera ontriggerenter(), ontriggerexit() ketika anda memasuki area collider dan mendeteksi pemicu, panggil fungsi kustom showicon() untuk mengaktifkan ikon ketika anda keluar dari area collider, panggil fungsi kustom hideicon() untuk menonaktifkan ikon 3\) setelah menyelesaikan pembuatan skrip, tambahkan skrip ke objek dockpoint 4\) tetapkan kanvas ikon pref, posisi ikon dari inspector langkah 4 2 interaksi gesture 1\) buat proyek > buat > zepeto > typescript dan ganti namanya menjadi interaksi gesture 2\) tulis skrip contoh seperti di bawah ini import { animationclip, animator, humanbodybones, physics, transform, vector3, waitforendofframe} from 'unityengine'; import { zepetoscriptbehaviour } from 'zepeto script'; import { zepetoplayers, zepetocharacter } from "zepeto character controller"; import interactionicon from ' /interactionicon'; export default class gestureinteraction extends zepetoscriptbehaviour { @serializefield() private animationclip animationclip; @serializefield() private issnapbone boolean = true; @serializefield() private bodybone humanbodybones; @serializefield() private allowoverlap boolean = false; private interactionicon interactionicon; private isfirst boolean = true; private localcharacter zepetocharacter; private outposition vector3; private playergestureposition vector3; private start() { this interactionicon = this transform getcomponent\<interactionicon>(); zepetoplayers instance onaddedlocalplayer addlistener(() => { this localcharacter = zepetoplayers instance localplayer zepetoplayer character; }); this interactionicon onclickevent addlistener(()=> { // ketika ikon interaksi diklik this interactionicon hideicon(); this dointeraction(); }); } private dointeraction() { this outposition = this transform position; if (this issnapbone) { // apakah tempat kosong if (this allowoverlap || this findotherplayernum() < 1) { this localcharacter setgesture(this animationclip); this startcoroutine(this snapbone()); this startcoroutine(this waitforexit()); } else { // tempat duduk sudah penuh this interactionicon showicon(); } } else { this localcharacter setgesture(this animationclip); this startcoroutine(this waitforexit()); } } private snapbone() { const animator animator = this localcharacter zepetoanimator; const bone transform = animator getbonetransform(this bodybone); let idx = 0; while(true) { const distance = vector3 op subtraction(bone position, this localcharacter transform position); const newpos vector3 = vector3 op subtraction(this transform position, distance); this playergestureposition = newpos; this localcharacter transform position = this playergestureposition; this localcharacter transform rotation = this transform rotation; yield new waitforendofframe(); idx++; // kalibrasi posisi selama 5 frame animasi if (idx > 5) { return; } } } // metode yang tepat harus melalui kode server, // tetapi dihitung oleh klien lokal untuk optimasi server private findotherplayernum() { const hitinfos = physics overlapsphere(this transform position, 0 1); let playernum = 0; if (hitinfos length > 0) { hitinfos foreach((hitinfo) => { if (hitinfo transform getcomponent\<zepetocharacter>()) { playernum ++; } }); } return playernum; } private waitforexit() { if (this localcharacter) { while (true) { if (this localcharacter tryjump || this localcharacter trymove) { this localcharacter cancelgesture(); this transform position = this outposition; this interactionicon showicon(); break; } else if(this issnapbone && this playergestureposition != this localcharacter transform position){ this interactionicon showicon(); break; } yield; } } } } alur skrip adalah sebagai berikut mulai() ketika ikon diklik, itu dinonaktifkan dan memanggil fungsi kustom dointeraction() dointeraction() jika issnapbone dicentang, jika kursi kosong (allowoverlap dicentang, atau nilai kembalian fungsi kustom findotherplayernum() kurang dari 1) ambil gerakan yang ditugaskan ke animationclip mulai coroutine snapbone() dan lampirkan bodybone karakter zepeto ke targettranform mulai coroutine waitforexit() ketika karakter zepeto melompat atau bergerak, atau keluar dari area collider, batalkan gerakan dan aktifkan ikon aktifkan ikon ketika kapasitas tempat duduk sudah penuh jika issnapbone tidak dicentang, ambil gerakan yang ditugaskan ke animationclip mulai coroutine waitforexit() 3\) setelah menyelesaikan pembuatan skrip, tambahkan skrip ke objek dockpoint 4\) tetapkan klip animasi, apakah snap bone, body bone, dan izinkan overlap di inspector tetapkan klip animasi ini adalah gestur yang harus diambil dengan interaksi periksa apakah snapbone pastikan bahwa bagian yang ditetapkan ke body bone diposisikan sebagai dockpoint tetapkan body bone ke hips pastikan bahwa pinggul diposisikan di dockpoint karena ini akan menjadi gestur duduk izinkan overlap memungkinkan anda menentukan apakah beberapa orang dapat duduk di satu kursi langkah 5 main tombol akan muncul ketika karakter zepeto mendekati objek, dan menghilang ketika menjauh jika gerakan yang anda atur dimainkan saat mendekati dan berinteraksi dengan tombol, itu adalah keberhasilan selain gerakan, berbagai peristiwa dapat diterapkan untuk terjadi setelah interaksi berikut adalah contoh penerapan peristiwa yang menciptakan item setelah interaksi https //www youtube com/watch?v=ooazdb4 lgo https //www youtube com/watch?v=ooazdb4 lgo 📘 contoh zepeto world contoh interaksi bab 3 https //github com/naverz/zepeto world sample/tree/main/assets/chapter3 https //github com/naverz/zepeto world sample/tree/main/assets/chapter3