Dengan peta yang dibuat, saatnya untuk mulai membangun skrip.Sisa dari kursus ini akan berfokus besar pada menulis semua elemen berbeda dari loop permainan.
Menyiapkan skrip
Pertempuran royale akan menggunakan kombinasi skrip modul dan skrip normal. Di bawah ini adalah skrip dan fungsinya.
Manajer Permainan | Skrip. Menjalankan fungsi dari Manajer Pertandingan menggunakan variabel dari Pengaturan Game |
Manajer Pertandingan | Skrip Modul. Menjalankan fungsi seperti mengirim pemain ke arena atau melacak waktu dalam mencocokkan. |
Pengaturan Permainan | Skrip Modul. Menyimpan variabel umum yang digunakan oleh skrip lain. |
Skrip Pengaturan Game
Buat skrip modul bernama GameSettings untuk menyimpan variabel yang digunakan oleh skrip lain, seperti durasi pertandingan dan jeda.Variabel ini akan digunakan oleh skrip GameManager nanti.
Di ServerStorage , buat folder bernama ModuleScripts. Di folder itu, buat skrip modul baru bernama GameSettings.
Buka GameSettings dan ganti tabel modul untuk sesuai dengan nama skrip.
local GameSettings = {}return GameSettingsDi tabel modul, tambahkan variabel untuk penggunaan berikut. Ambil kiraan terbaik untuk setiap nilai, Anda selalu dapat mengubahnya nanti saat Anda menguji.
- Durasi Istirahat - Detik pemain menunggu sebelum mencocokkan.
- Durasi Pertandingan - Panjang pertandingan dalam detik.
- Pemain Minimum - Angka pemain terkecil yang diperlukan untuk memulai.
- Waktu Transisi - Waktu sebelum dan sesudah pertandingan dalam beberapa detik. Membuat transisi antara bagian-bagian dari loop permainan kurang tiba-tiba.
local GameSettings = {}-- Variabel PermainanGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
Skrip Manajer Pertandingan
Skrip kedua yang terhubung ke GameManager adalah MatchManager.Skrip ini mengelola tugas seperti memulai timer atau mengatur ulang pemain setelah pertandingan berakhir.
Di dalam MatchManager ada fungsi bernama prepareGame() yang memulai permainan dengan mengalihkan pemain ke mencocokkan.
Di ServerStorage > ModuleScripts > tambahkan skrip modul bernama MatchManager. Ganti nama tabel modul.
local MatchManager = {}return MatchManagerTambahkan fungsi modul baru ke MatchManager bernama prepareGame(). Sertakan pernyataan cetak untuk menguji skrip nanti.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
Kodekan loop permainan
Lingkaran permainan utama akan dikodekan dalam skrip GameManager menggunakan variabel yang baru saja dibuat.Ingat, ada tiga fase dalam lingkaran permainan: jeda, kompetisi, dan pembersihan & resetulang.
Skrip Manajer Game
Skrip ini adalah skrip server normal, jadi letakkan di ServerScriptService, bukan di folder skrip modul.Lingkaran permainan yang sebenarnya akan berada di dalam sementara true do loop.
Di ServerScriptService, buat skrip baru dengan nama GameManager.
Tambahkan variabel untuk layanan "ServerStorage", di mana Modulescripts berada.Kemudian tambahkan variabel untuk layanan "Pemain", yang akan diperlukan untuk memeriksa jumlah pemain selama jeda.
-- Layananlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Untuk menggunakan modul yang dibuat sebelumnya:
- Tetapkan variabel bernama moduleScripts ke lokasi folder ModuleScripts.
- Tambahkan variabel bernama matchManager dan gameSettings . Setiap variabel harus memerlukan skrip masing-masing.
-- Layananlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))Setelah variabel, tambahkan loop while true do . Semua fase dari loop permainan akan masuk ke dalam untuk diulang tanpa batas.
-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Lingkaran permainan utamawhile true doend
Kode jeda
Sementara loop permainan berjalan tanpa batas, jeda harus menghentikan loop dan hanya melanjutkan ketika ada cukup banyak pemain untuk mencocokkan.Untuk mengkode jeda ini, termasuk loop berulang terkait untuk istirahat dalam loop while.Lingkaran terpisah itu akan diulang sampai ada cukup pemain, membekukan loop utama.Setelah ada cukup pemain, itu akan keluar dan beralih pemain ke mencocokkan.
Dengan loop berulang **** , kode di loop akan dijalankan setidaknya sekali.Tidak seperti loop while, ia tidak memeriksa kondisinya sampai loop berakhir.Ini memastikan pemain selalu pergi ke lobi sebelum mencocokkan.
Di dalam loop while true do , ketik repeat dan tekan Enter untuk menyelesaikan secara otomatis dengan kata kunci until .
while true dorepeatuntilendPeriksa apakah jumlah pemain saat ini (#Players:GetPlayers()) lebih besar atau sama dengan variabel minimumPlayers yang dibuat sebelumnya di modul GameSettings.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendDi loop ulang, tambahkan pernyataan cetak yang mengatakan jeda dimulai.Gunakan task.wait() untuk berhenti selama jeda menggunakan intermissionDuration dari GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendTes uji dan periksa bahwa pernyataan cetak "Starting intermission" ditampilkan setidaknya dua kali.Melihat pesan dua kali membuktikan bahwa loop berulang tidak menemukan cukup pemain dan berjalan lagi.Anda harus menunggu lama jeda sebelum melihat pesan untuk kedua kalinya.
Tip pemecahan masalah
Pada titik ini, jika Anda tidak muncul seperti yang diinginkan, coba salah satu dari berikut ini.
- task.wait() harus berada di dalam loop ulang.Tanpa menunggu, skrip akan menjalankan terlalu banyak kali dalam satu detik, membebani Roblox Studio dan menyebabkan kesalahan.
- Di modul Pengaturan Permainan, variabel intermissionDuration harus lebih besar dari 1. Jika lebih rendah, skrip dapat diulang terlalu sering, menyebabkan masalah penurunan kecepatan.
Akhiri jeda
Setelah ada cukup banyak pemain, memiliki mereka menunggu waktu transisi singkat.Kemudian, kirim mereka ke pertandingan dengan memanggil fungsi prepareGame() di MatchManager.Ingat, fungsi hanya mencetak satu baris, tetapi Anda akan menambahkan lebih banyak kode nanti.
Di akhir loop berulang, tambahkan pernyataan cetak yang mengatakan istirahat sudah berakhir untuk menguji kode Anda.Kemudian, ikuti dengan task.wait() menggunakan variabel GameSetting's transitionTime .
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endSetelah menunggu, hubungi prepareGame() dari modul MatchManager.Ketika kode dijalankan, ini hanya akan mencetak teks ke jendela Output.Tunggu sampai bagian berikutnya untuk menguji kode ini.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Uji permainan multiplayer
Saat ini, untuk memiliki kode dijalankan prepareGame() , perlu keluar dari loop ulang.Tetapi, untuk melakukan itu, harus ada lebih dari satu pemain.Ini berarti jika Anda menggunakan tombol playtest, fungsi tidak akan pernah dijalankan karena Anda adalah satu-satunya pemain dalam permainan (kecuali jika pemain minimum Anda adalah satu).Untuk menguji ini, Anda perlu menyimulasikan gamemultiplayer.
Memulai server lokal
Untuk menguji kode yang membutuhkan lebih dari satu pemain, buat server lokal.Sementara game yang dipublikasikan biasanya ada di server Roblox, server lokal simulasikan permainan multiplayer di komputer Anda dengan pemain simulasi.
Untuk memulai server lokal, di tab Tes > Klien dan Server bagian > atur dropdown pemain ke nomor pemain minimum dalam variabel GameSetting's minimumPlayers.Pelajaran ini menggunakan 2 pemain.
Klik Mulai untuk memulai server.
Tunggu beberapa detik agar server dapat disiapkan.Beberapa jendela akan terbuka selain jendela Studio asli Anda.Anda mungkin perlu mengizinkan akses ke Roblox Studio dari firewall atau perangkat lunak keamanan online lainnya.
Tip pemecahan masalah
Pada titik ini, Anda tidak dapat melihat server pengujian, coba salah satu dari berikut ini.
- Jika Anda memiliki masalah dengan server mulai, periksa ulang artikel Masalah Firewall dan Router.
- Atur jumlah pemain menjadi jumlah kecil, seperti 2 atau 3.
- Jika masalah tidak diselesaikan, coba restart Studio atau memulai ulang komputer Anda.
Menguji di server lokal
Anda akan melihat beberapa jendela saat server dimulai. Masing-masing mewakili bagian berbeda dari hubungan server/klien.
- Server (batas hijau) menjalankan game.
- Klien (batas biru) menyimulasikan pengalaman pemain.


Dengan server menyala, Anda dapat memeriksa apakah kode berfungsi.
Temukan jendela Server dengan border hijau.Periksa pernyataan cetak yang dipanggil dari skrip MatchManager.Karena ada loop ulang, Anda akan melihat pernyataan cetak yang sama diulang.
Setelah Anda selesai menguji, di jendela mana pun, tutup server dengan tombol Bersihkan.Ini menutup semua jendela Server dan Klien dan membawa Anda kembali ke jendela Studio normal.
Tip pemecahan masalah
Pada titik ini, jika pernyataan cetak yang dimaksud tidak muncul, coba salah satu dari berikut ini.
- Periksa bahwa fungsi seperti prepareGame() berada dalam cakupan loop while true.
- Jika cetakan dari MatchManager tidak berfungsi, periksa beberapa solusi umum dengan skrip modul, seperti memastikan bahwa skrip MatchManager diperlukan di GameManager atau bahwa prepareGame() ditambahkan ke tabel modul itu.
Skrip selesai
Di bawah ini adalah skrip yang selesai untuk memeriksa ulang pekerjaan Anda.
Skrip Manajer Game
-- Layananlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Lingkaran permainan utamawhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Skrip Manajer Pertandingan
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
Skrip Pengaturan Game
local GameSettings = {}-- Variabel PermainanGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings