BUAT DUNIAMU
Pemain & Karakter: Lanjutan
Panduan Pembuatan Pemain Bot
17mnt
pemain bot digunakan untuk mengisi ketika tidak ada cukup orang untuk memulai dunia multiplayer, atau ketika seorang pemain meninggalkan dunia selama permainan bagaimana perilaku pemain bot perlu diimplementasikan untuk setiap konten panduan ini menjelaskan metode umum untuk membuat pemain bot 📘 panduan pembuatan pemain bot didasarkan pada panduan multiplayer \[ tutorial bermain ganda docid\ lyyby8vxbmg toab1ufuw ] langkah 1 buat pemain bot 1 1 tambahkan nilai boolean yang disebut isbot ke skema multiplayer 1 2 definisikan fungsi di bawah ini untuk membuat pemain bot dalam skrip server index ts dan panggil di titik yang diinginkan index ts // metode `createbot()` digunakan untuk membuat pemain bot dengan `userid` yang diberikan createbot(userid string) { // menghasilkan id sesi untuk pemain bot menggunakan `userid` yang diberikan const sessionid = "bot " + userid; // periksa apakah pemain bot dengan id sesi yang sama sudah ada jika ya, kembalikan tanpa membuat duplikat if (this state players has(sessionid)) { return; } // buat objek `player` baru untuk pemain bot const player player = new player(); player sessionid = sessionid; if (userid) { player zepetouserid = userid; } player isbot = true; // tambahkan pemain bot ke peta pemain di state menggunakan id sesi sebagai kunci this state players set(player sessionid, player); this botmap set(sessionid, player); } 👍 tips userid dari pengguna tertentu disimpan sebelumnya untuk karakter pemain bot yang akan dibuat anda dapat memeriksa userid dari pengguna tertentu dengan memeriksa userid dari klien yang terhubung ke onjoin di server setelah menulis skrip di bawah ini dalam skrip server, sambungkan dari dunia yang relevan index ts onjoin(client sandboxplayer) { 	console log(client userid); } langkah 2 buat pemain bot di klien 2 1 jika anda memiliki server yang membuat pemain bot pada suatu titik, klien akan mengenalinya sebagai pemain baru di onjoinplayer() buat proyek > buat > zepeto > typescript dan ganti namanya menjadi botplayermanager tambahkan logika di onaddedplayer() untuk membuat setiap pemain, dan tambahkan logika untuk membedakan pemain bot dan membuat karakter zepeto mereka botplayermanager ts import { zepetocharacter, zepetoplayers } from 'zepeto character controller'; import { room } from 'zepeto multiplay'; import { zepetoscriptbehaviour } from 'zepeto script' import { zepetoworldmultiplay } from 'zepeto world'; export default class botplayermanager extends zepetoscriptbehaviour { public zepetoworldmultiplay zepetoworldmultiplay; // variabel privat untuk menyimpan ruangan saat ini dan data pemain bot private room room; private botmapdata map\<string, zepetocharacter> = new map\<string, zepetocharacter>(); start() { 		 	 // dengarkan acara `roomjoined` dari komponen `zepetoworldmultiplay` this zepetoworldmultiplay roomjoined += (room room) => { this room = room; } 	 // dengarkan acara `onaddedplayer` dari `zepetoplayers instance` untuk menangani pemain yang baru ditambahkan zepetoplayers instance onaddedplayer addlistener((userid string) => { 	 // dapatkan data pemain saat ini dari status ruangan menggunakan `userid` const currentplayer = this room state players get item(userid); 	 // periksa apakah pemain adalah bot, dan jika ya, tetapkan mereka sebagai pemain bot if (currentplayer isbot) { this setbotplayer(currentplayer sessionid); } }); } } 2 2 tulis fungsi setbotplayer untuk menambahkan tag dan komponen sinkronisasi ke pemain bot dan buat skrip untuk mengendalikannya set botmapdata untuk menyimpan data pemain bot dalam format peta untuk mengelola pemain bot botplayermanager ts // metode `setbotplayer()` digunakan untuk mengatur pemain sebagai bot setbotplayer(userid string) { // dapatkan karakter zepeto yang terkait dengan pemain bot menggunakan `userid` mereka const bot = zepetoplayers instance getplayer(userid) character; // atur nama karakter ke `userid` untuk identifikasi bot gameobject name = userid; // simpan data pemain bot dalam peta ` botmapdata` menggunakan `userid` mereka sebagai kunci 	 this botmapdata set(userid, bot); } 👍 tips anda dapat menambahkan skrip atau pengaturan tambahan ke setbotplayer() untuk mengendalikan perilaku pemain bot langkah 3 buat tombol pemain bot di klien untuk dunia yang memerlukan sejumlah pemain tertentu untuk memulai, terkadang tidak ada cukup pemain dan anda harus menunggu lama untuk dunia dimulai dalam hal ini, anda dapat memulai dunia dengan menambahkan pemain bot 3 1 daftarkan fungsi untuk mengeksekusi createbot() ketika server menerima pesan dari klien di index ts async oncreate() { 	 // tangani pesan "createbot", yang membuat pemain bot dengan userid yang diberikan this onmessage("createbot", (client, message) => { this createbot(message); }); } 3 2 dalam skrip klien botplayermanager ts, tulis fungsi untuk mengirim pesan "createbot" ke server cara untuk mengeksekusi fungsi adalah dengan mengirim pesan dengan menekan tombol kirim id pengguna dari pemain bot yang akan dibuat sebagai string melalui pesan botplayermanager ts public buttoncreatebot button; public botplayerid string; start() {	 	 // tambahkan pendengar klik ke tombol "buat bot" untuk mengirim pesan untuk membuat pemain bot 	 this buttoncreatebot onclick addlistener(() => { this room send("createbot", this botplayerid); }); } 3 3 sekarang, ketika anda menjalankan server dan runtime, anda dapat melihat bahwa pemain bot dibuat ketika anda menekan tombol langkah 4 mulai dunia dengan menambahkan pemain bot ketika tidak ada cukup pemain untuk memulai dunia, anda dapat menambahkan pemain bot untuk memulai dunia 4 1 dalam skrip server, tambahkan kode berikut selama onjoin untuk memeriksa jumlah pemain dan memulai dunia ketika ada setidaknya empat pemain tambahkan fungsi untuk memeriksa jumlah pemain di createbot() tambahkan penghitung untuk jumlah permainan di fungsi startworld() index ts async onjoin(client sandboxplayer) { // periksa jumlah pemain di ruangan setelah seorang pemain bergabung 	this checkplayernumber(); } // metode `checkplayernumber()` memeriksa jumlah pemain di ruangan dan memulai dunia jika ada setidaknya empat pemain checkplayernumber() { 	// cetak jumlah pemain saat ini di ruangan ke konsol 	console log(`jumlah pemain, ${this state players size}`); 	// jika ada setidaknya empat pemain di ruangan, mulai dunia 	if (this state players size >= 4) { this startworld(); 	} } // metode `createbot()` digunakan untuk membuat pemain bot dengan `userid` yang diberikan createbot(userid string) { 	// hasilkan id sesi untuk pemain bot menggunakan `userid` yang diberikan 	const sessionid = "bot " + userid; 	// periksa apakah pemain bot dengan id sesi yang sama sudah ada jika ya, kembali tanpa membuat duplikat if (this state players has(sessionid)) { 	return; 	} 	// buat objek `player` baru untuk pemain bot 	const player player = new player(); player sessionid = sessionid; 	if (userid) { 	 player zepetouserid = userid; 	} 	player isbot = true; 	// tambahkan pemain bot ke peta pemain negara menggunakan id sesi sebagai kunci 	this state players set(player sessionid, player); 	this botmap set(sessionid, player); 	// periksa jumlah pemain di ruangan setelah menambahkan pemain bot 	this checkplayernumber(); } private playtime number = 0; // metode `startworld()` meningkatkan waktu bermain dan menyiarkan pesan "startworld" ke semua klien startworld() { 	 this playtime += 1; // cetak pesan yang menunjukkan dimulainya dunia dan waktu bermain saat ini console log("mulai dunia!"); this broadcast("startworld", this playtime); } di server, onjoin dieksekusi ketika pemain nyata bergabung ke ruangan jadi, ketika pemain bot dibuat melalui createbot dan ketika seorang pemain masuk melalui onjoin, checkplayernumber() menambahkan jumlah orang 4 2 dalam skrip klien, botplayermanager ts, tulis startworld(), yang dieksekusi ketika pesan startworld diterima dari server botplayermanager ts start() { 	// dengarkan untuk event `roomjoined` dari komponen `zepetoworldmultiplay` 	this zepetoworldmultiplay roomjoined += (room room) => { // tambahkan handler pesan untuk tipe pesan "startworld" 	this room addmessagehandler("startworld", (playtime number) => { this startworld(playtime); }); } // metode `startworld()` dipanggil ketika dunia dimulai dengan `playtime` yang diberikan startworld(playtime number) { 	// cetak pesan mulai dunia bersama dengan `playtime` console log(`mulai dunia ${playtime}`); } 4 3 saat runtime, ketika ada lebih dari 4 pemain, termasuk pemain bot, anda dapat melihat log yang disebut world start muncul di konsol server dan di konsol klien langkah 5 sinkronkan posisi pemain bot di bawah ini adalah contoh kode yang memindahkan pemain bot yang ditambahkan ke posisi pemain lokal dan menyinkronkan posisi gerakan 5 1 pertama, tulis kode untuk memindahkan pemain bot ketika pesan movebot diterima dari klien di index ts dari server async oncreate() { // tangani pesan "movebot", yang memindahkan pemain bot ke posisi yang ditentukan 	this onmessage("movebot", (client, message) => { this movebot(client, message); }); } // metode `movebot()` memindahkan pemain bot ke posisi yang ditentukan berdasarkan pesan yang diterima movebot(client sandboxplayer, message string) { // parse pesan json yang diterima dari klien untuk mengekstrak informasi posisi const position = json parse(message); // buat objek pesan baru dengan id sesi pengguna dan data posisi yang diparse const newmessage = { user client sessionid, positionx position x, positiony position y, positionz position z } // siarkan pesan "movebottoposition" ke semua klien dengan data pesan baru sebagai string json this broadcast("movebottoposition", json stringify(newmessage)); } 5 2 dalam skrip klien, botplayermanager ts, tulis sendbotposition() yang mengirim posisi pemain lokal ke server ketika buttoncallbot ditekan kemudian tulis kode untuk memindahkan semua pemain bot ke lokasi informasi yang disertakan dalam pesan ketika pesan movebottoposition diterima dari server botplayermanager ts public buttoncallbot button; start(){ 	// dengarkan untuk acara `roomjoined` dari komponen `zepetoworldmultiplay` this zepetoworldmultiplay roomjoined += (room room) => { this room = room; // tambahkan pengendali pesan untuk jenis pesan "startworld" this room addmessagehandler("startworld", (playtime number) => { this startworld(playtime); }); 	// tambahkan pendengar klik ke tombol "call bot" untuk mengirim pesan untuk mengirim posisi pemain bot 	this buttoncallbot onclick addlistener(() => { 	 this sendbotposition(); 	}); } // metode ini mengirim posisi karakter pemain lokal ke server untuk sinkronisasi gerakan bot sendbotposition() { // dapatkan posisi karakter pemain lokal const localplayerposition = zepetoplayers instance localplayer zepetoplayer character transform position; // buat objek posisi yang berisi koordinat x, y, dan z dari karakter pemain lokal const position = { x localplayerposition x, y localplayerposition y, z localplayerposition z } // ubah objek posisi menjadi string json dan kirim ke server dengan jenis pesan "movebot" this room send("movebot", json stringify(position)); } movebottoposition(message) { // parse pesan json yang diterima dari klien untuk mengekstrak informasi posisi const jsonmessage = json parse(message); const position = new vector3(jsonmessage positionx, jsonmessage positiony, jsonmessage positionz); // pindahkan setiap karakter bot dalam peta ` botmapdata` ke posisi yang ditentukan dengan sedikit offset acak pada sumbu x dan z this botmapdata foreach((character zepetocharacter) => { // metode `movetoposition()` digunakan untuk memindahkan karakter ke posisi yang ditentukan // di sini, sedikit offset acak ditambahkan ke posisi target untuk menciptakan gerakan yang terlihat alami untuk bot character movetoposition(position + new vector3(random range(0 5, 1), 0, random range(0 5, 1))); }); } 5 3 sekarang jika anda membuat pemain bot saat runtime dan menekan tombol buttoncallbot, anda harus melihat pemain bot yang dibuat bergerak ke posisi karakter pemain lokal kode lengkap botplayermanager ts botplayermanager ts import { random, vector3 } from 'unityengine'; import { button } from 'unityengine ui'; import { zepetocharacter, zepetoplayers } from 'zepeto character controller'; import { room } from 'zepeto multiplay'; import { zepetoscriptbehaviour } from 'zepeto script' import { zepetoworldmultiplay } from 'zepeto world'; export default class botplayermanager extends zepetoscriptbehaviour { // properti publik untuk merujuk komponen dan pengaturan yang diperlukan dari inspector public zepetoworldmultiplay zepetoworldmultiplay; public buttoncreatebot button; public buttoncallbot button; public botplayerid string; // variabel privat untuk menyimpan data ruangan dan pemain bot saat ini private room room; private botmapdata map\<string, zepetocharacter> = new map\<string, zepetocharacter>(); start() { // mendengarkan event `roomjoined` dari komponen `zepetoworldmultiplay` this zepetoworldmultiplay roomjoined += (room room) => { this room = room; // menambahkan handler pesan untuk tipe pesan "startworld" this room addmessagehandler("startworld", (playtime number) => { this startworld(playtime); }); } // mendengarkan event `onaddedplayer` dari `zepetoplayers instance` untuk menangani pemain yang baru ditambahkan zepetoplayers instance onaddedplayer addlistener((userid string) => { // mendapatkan data pemain saat ini dari status ruangan menggunakan `userid` const currentplayer = this room state players get item(userid); // memeriksa apakah pemain adalah bot, dan jika ya, menetapkannya sebagai pemain bot if (currentplayer isbot) { this setbotplayer(currentplayer sessionid); } }); // menambahkan listener klik pada tombol "buat bot" untuk mengirim pesan untuk membuat pemain bot this buttoncreatebot onclick addlistener(() => { this room send("createbot", this botplayerid); }); this zepetoworldmultiplay roomjoined += (room room) => { this room = room; this room addmessagehandler("movebottoposition", (message string) => { this movebottoposition(message); }); } // menambahkan listener klik pada tombol "panggil bot" untuk mengirim pesan untuk mengirim posisi pemain bot this buttoncallbot onclick addlistener(() => { this sendbotposition(); }); } // metode `setbotplayer()` digunakan untuk menetapkan pemain sebagai bot setbotplayer(userid string) { // mendapatkan karakter zepeto yang terkait dengan pemain bot menggunakan `userid` mereka const bot = zepetoplayers instance getplayer(userid) character; // menetapkan nama karakter ke `userid` untuk identifikasi bot gameobject name = userid; // menyimpan data pemain bot dalam peta ` botmapdata` menggunakan `userid` mereka sebagai kunci this botmapdata set(userid, bot); } // metode `startworld()` dipanggil saat dunia dimulai dengan `playtime` yang diberikan startworld(playtime number) { // mencetak pesan mulai dunia bersama dengan `playtime` console log(`mulai dunia ${playtime}`); } // metode ini mengirim posisi karakter pemain lokal ke server untuk sinkronisasi gerakan bot sendbotposition() { // mendapatkan posisi karakter pemain lokal const localplayerposition = zepetoplayers instance localplayer zepetoplayer character transform position; // membuat objek posisi yang berisi koordinat x, y, dan z dari karakter pemain lokal const position = { x localplayerposition x, y localplayerposition y, z localplayerposition z } // mengonversi objek posisi menjadi string json dan mengirimkannya ke server dengan tipe pesan "movebot" this room send("movebot", json stringify(position)); } // metode ini dipanggil saat server menerima pesan "movebot" dari klien dan memindahkan karakter bot ke posisi yang ditentukan movebottoposition(message) { // mengurai pesan json yang diterima dari klien untuk mengekstrak informasi posisi const jsonmessage = json parse(message); const position = new vector3(jsonmessage positionx, jsonmessage positiony, jsonmessage positionz); // memindahkan setiap karakter bot dalam peta ` botmapdata` ke posisi yang ditentukan dengan sedikit offset acak pada sumbu x dan z this botmapdata foreach((character zepetocharacter) => { // metode `movetoposition()` digunakan untuk memindahkan karakter ke posisi yang ditentukan // di sini, sedikit offset acak ditambahkan ke posisi target untuk menciptakan gerakan yang terlihat alami untuk bot character movetoposition(position + new vector3(random range(0 5, 1), 0, random range(0 5, 1))); }); } } kode lengkap server index ts import { sandbox, sandboxoptions, sandboxplayer } from "zepeto multiplay"; import { datastorage } from "zepeto multiplay datastorage"; import { player, transform, vector3 } from "zepeto multiplay schema"; export default class extends sandbox { storagemap map\<string, datastorage> = new map\<string, datastorage>(); // simpan data peta pemain bot sebagai botmap private botmap map\<string, player> = new map\<string, player>(); private playtime number = 0; constructor() { super(); } oncreate(options sandboxoptions) { // dipanggil saat objek ruang dibuat // tangani status atau inisialisasi data objek ruang this onmessage("onchangedtransform", (client, message) => { this state players get(client sessionid); 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; if (player) { player transform = transform; } }); this onmessage("onchangedstate", (client, message) => { const player = this state players get(client sessionid); if (player) { player state = message state; player substate = message substate; } }); // tangani pesan "createbot", yang membuat pemain bot dengan userid yang diberikan this onmessage("createbot", (client, message) => { this createbot(message); }); // tangani pesan "movebot", yang memindahkan pemain bot ke posisi yang ditentukan this onmessage("movebot", (client, message) => { this movebot(client, message); }); } // metode `createbot()` digunakan untuk membuat pemain bot dengan `userid` yang diberikan createbot(userid string) { // hasilkan id sesi untuk pemain bot menggunakan `userid` yang diberikan const sessionid = "bot " + userid; // periksa apakah pemain bot dengan id sesi yang sama sudah ada jika ada, kembali tanpa membuat duplikat if (this state players has(sessionid)) { return; } // buat objek `player` baru untuk pemain bot const player player = new player(); player sessionid = sessionid; if (userid) { player zepetouserid = userid; } player isbot = true; // tambahkan pemain bot ke peta pemain state menggunakan id sesi sebagai kunci this state players set(player sessionid, player); this botmap set(sessionid, player); // periksa jumlah pemain di ruangan setelah menambahkan pemain bot this checkplayernumber(); } // metode `checkplayernumber()` memeriksa jumlah pemain di ruangan dan memulai dunia jika ada setidaknya empat pemain checkplayernumber() { // cetak jumlah pemain saat ini di ruangan ke konsol console log(`jumlah pemain, ${this state players size}`); // jika ada setidaknya empat pemain di ruangan, mulai dunia if (this state players size >= 4) { this startworld(); } } // metode `startworld()` meningkatkan waktu bermain dan menyiarkan pesan "startworld" ke semua klien startworld() { this playtime += 1; // cetak pesan yang menunjukkan dimulainya dunia dan waktu bermain saat ini console log("mulai dunia!"); this broadcast("startworld", this playtime); } // metode `movebot()` memindahkan pemain bot ke posisi yang ditentukan berdasarkan pesan yang diterima movebot(client sandboxplayer, message string) { // parse pesan json yang diterima dari klien untuk mengekstrak informasi posisi const position = json parse(message); // buat objek pesan baru dengan id sesi pengguna dan data posisi yang diparsing const newmessage = { user client sessionid, positionx position x, positiony position y, positionz position z } // siarkan pesan "movebottoposition" ke semua klien dengan data pesan baru sebagai string json this broadcast("movebottoposition", json stringify(newmessage)); } async onjoin(client sandboxplayer) { // buat objek pemain yang didefinisikan dalam schemas json dan atur nilai awal console log(`\[onjoin] sessionid ${client sessionid}, hashcode ${client hashcode}, userid ${client userid}`) const player = new player(); player sessionid = client sessionid; if (client hashcode) { player zepetohash = client hashcode; } if (client userid) { player zepetouserid = client userid; } // \[datastorage] memuat datastorage dari pemain yang masuk const storage datastorage = client loaddatastorage(); this storagemap set(client sessionid, storage); let visit cnt = await storage get("visitcount") as number; if (visit cnt == null) visit cnt = 0; console log(`\[onjoin] jumlah kunjungan ${client sessionid} ${visit cnt}`) // \[datastorage] perbarui jumlah kunjungan pemain dan kemudian simpan storage await storage set("visitcount", ++visit cnt); // kelola objek pemain menggunakan sessionid, nilai kunci unik dari objek klien // klien dapat memeriksa informasi tentang objek pemain yang ditambahkan dengan set dengan menambahkan acara add onadd ke objek pemain this state players set(client sessionid, player); // periksa jumlah pemain di ruangan setelah seorang pemain bergabung this checkplayernumber(); } ontick(deltatime number) void { // ini dipanggil berulang kali pada setiap waktu yang ditetapkan di server, dan acara interval tertentu dapat dikelola menggunakan deltatime } async onleave(client sandboxplayer, consented? boolean) { // dengan mengatur allowreconnection, dimungkinkan untuk mempertahankan koneksi untuk sirkuit, tetapi bersihkan segera 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); } }