Singkatnya
Untuk membuat script di Roblox Studio, arahkan kursor ke ServerScriptService di Explorer, klik + dan sisipkan Script. Studio membukanya di Script Editor. Ketik Luau, misalnya print("Hello"), tekan Play (F5) dan baca hasilnya di jendela Output (menu Window atau tab Script). Script berjalan di server dan mengubah sesuatu untuk semua orang; LocalScript di StarterPlayerScripts berjalan di perangkat satu pemain.
- Pelajari empat ide dulu: variabel (
local coins = 3), function (local function name() ... end), if statement dan event (part.Touched:Connect(...)). Empat script di panduan ini dibangun dari itu, plus loop dan table. - Pakai
task.wait(), bukanwait(). Referensi Roblox menandaiwait()global sebagai deprecated dan digantikan olehtask.wait(). - Di opsi tampilan jendela Output, nyalakan Show Context supaya setiap baris menunjukkan apakah datang dari Server atau Client.
Di halaman ini
Sebelum mulai: Studio, Baseplate dan jendela Output
Kamu butuh Roblox Studio dan akun Roblox, tidak ada yang lain: tanpa code editor dan tanpa plugin. Setiap script di panduan ini diketik di Script Editor milik Studio sendiri.
- Pasang Roblox Studio, aplikasi gratis Roblox untuk Windows dan Mac, dan login dengan akun Roblox kamu.
- Buka Studio. Halaman awalnya mencantumkan template: pilih Baseplate. Kamu dapat lantai dengan tekstur grid 4x4 dan SpawnLocation, tempat avatar kamu muncul saat bermain.
- Kalau jendela Explorer dan Properties tidak tampil, buka dari menu Window atau tab Home. Explorer mencantumkan setiap objek di place kamu; Properties menampilkan pengaturan apa pun yang kamu pilih.
- Buka Output dari menu Window atau tab Script. Di sinilah pesan dan error dari script kamu muncul.
- Di opsi tampilan jendela Output, nyalakan Show Context, yang memberi label Client atau Server pada setiap pesan, dan Show Source, yang menampilkan script dan nomor baris yang menghasilkannya.
| Script | Jenis | Tempatnya | Yang diajarkan |
|---|---|---|---|
FirstScript | Script | ServerScriptService | Variabel, function, if statement, loop dan table |
ColourChanger | Script | Di dalam Part di Workspace | Mengubah properti, script.Parent dan loop yang menunggu |
TouchPad | Script | Di dalam Part bernama Pad | Event, menemukan pemain yang menyentuh part, dan debounce |
MyFirstLocalScript | LocalScript | StarterPlayerScripts, di dalam StarterPlayer | Kode yang berjalan di perangkat satu pemain, tekanan tombol, dan apa yang tetap di perangkat itu |
Workspace
Baseplate Part
SpawnLocation SpawnLocation
Part Part new
ColourChanger Script new
Pad Part new
TouchPad Script new
ServerScriptService
FirstScript Script new
StarterPlayer
StarterPlayerScripts
MyFirstLocalScript LocalScript new
Langkah 1: Tulis script pertamamu
- Di Explorer, arahkan kursor ke ServerScriptService, klik tombol + dan pilih Script (shortcut-nya Ctrl+I, atau ⌘I di Mac). Studio membuat script itu dan membukanya di Script Editor.
- Klik kanan script baru itu, pilih Rename dan beri nama
FirstScript. Nama tidak mengubah apa yang dilakukan script, tapi memberi tahu kamu script mana yang mencetak apa. - Script baru dimulai dengan satu baris,
print("Hello world!"). Hapus lalu tempel kode di bawah. - Tekan Play (F5), dengan Test terpilih di dropdown di sebelah kirinya. Studio memulai playtest dan menaruh avatar kamu di SpawnLocation.
- Baca baris-baris di Output, lalu tekan Stop (Shift+F5). Stop juga mengembalikan setiap objek seperti sebelum kamu menekan Play, jadi apa pun yang kamu pindahkan atau ganti warnanya saat bermain akan kembali.
-- Script di ServerScriptService bernama FirstScript.
-- Luau pertamamu: variabel, function, if statement, loop dan table.
-- Tekan Play (F5) dan baca hasilnya di jendela Output.
-- Variabel adalah nama yang menyimpan sebuah nilai
local gameName = "Coin Run"
local coinsToWin = 3
-- Function adalah blok kode bernama yang bisa kamu jalankan sesering yang kamu mau.
-- name dan goal adalah parameternya; return mengembalikan nilai ke pemanggilnya.
local function describe(name: string, goal: number): string
return `{name}: collect {goal} coins to win`
end
print(describe(gameName, coinsToWin)) --> Coin Run: collect 3 coins to win
-- If statement menjalankan kode hanya kalau kondisinya benar
if coinsToWin > 5 then
print("That is a long game")
elseif coinsToWin > 1 then
print("That is a short game")
else
print("One coin and you win")
end
-- For loop mengulang kode sebanyak jumlah tertentu
for count = 1, coinsToWin do
print("Coin number", count)
end
-- Table menyimpan daftar nilai; loop ini mengunjungi masing-masing secara berurutan
local colours = { "Red", "Green", "Blue" }
for position, colour in colours do
print(position, colour) --> 1 Red, lalu 2 Green, lalu 3 Blue
end
Apa pun setelah -- di satu baris adalah komentar: Luau melewatinya, jadi kamu bisa meninggalkan catatan untuk dirimu sendiri. Komentar --> menunjukkan apa yang dicetak baris itu.
Output harus menampilkan delapan baris ini, bercampur dengan pesan dari Studio sendiri. Saat print mendapat lebih dari satu nilai, ia memberi spasi di antaranya. Dengan Show Context dan Show Source menyala, setiap baris juga diberi label Server dan FirstScript dengan nomor baris.
Coin Run: collect 3 coins to win
That is a short game
Coin number 1
Coin number 2
Coin number 3
1 Red
2 Green
3 Blue
Cocokkan setiap baris dengan kode yang mencetaknya. Nanti kamu akan melakukan hal yang sama dengan pesan error, jadi kebiasaan ini berguna dari sekarang.
FirstScript hanya memakai Luau biasa, tanpa objek Roblox, jadi bisa juga dijalankan di Luau playground gratis di browser kamu. Ubah satu nilai di sana dan jalankan lagi untuk melihat apa yang berubah.
| Kode | Ide | Artinya |
|---|---|---|
local gameName = "Coin Run" | Variabel | Nama yang menyimpan nilai. local berarti hanya script ini, atau blok tempatnya berada, yang bisa memakainya. Teks dalam tanda kutip adalah string; 3 adalah number. Nama membedakan huruf besar kecil, jadi coinsToWin dan CoinsToWin adalah dua variabel berbeda. |
local function describe(name: string, goal: number): string | Function | Blok kode bernama yang bisa kamu jalankan sesering yang kamu mau. name dan goal adalah parameter-nya: nilai yang diberikan setiap kali dipanggil. : string dan : number adalah anotasi tipe opsional. Luau memakainya untuk memperingatkan kesalahan di Script Editor; kodenya berjalan sama tanpa anotasi itu. |
return | Nilai kembali | Mengembalikan nilai ke kode yang memanggil function. print(describe(gameName, coinsToWin)) mencetak apa pun yang dikembalikan describe. |
`{name}: collect {goal} coins to win` | Interpolasi string | Teks dalam backtick bisa menampung nilai: Luau mengganti {name} dan {goal} dengan nilainya saat itu. |
if, elseif, else, end | If statement | Luau mengecek kondisi dari atas ke bawah dan hanya menjalankan yang pertama bernilai benar. coinsToWin bernilai 3, yang tidak lebih dari 5 tapi lebih dari 1, jadi hanya "That is a short game" yang dicetak. |
for count = 1, coinsToWin do | Numeric for loop | Menjalankan kode di dalamnya sekali untuk setiap angka dari 1 sampai coinsToWin, dengan count bernilai 1, lalu 2, lalu 3. |
{ "Red", "Green", "Blue" } dan for position, colour in colours do | Table dan loop | Table yang dipakai sebagai daftar, yang disebut Luau array. Posisinya mulai dari 1, bukan 0. Loop mengunjungi setiap item dan memberimu posisi dan nilainya. |
Setiap blok yang dibuka dengan function, if, for atau while ditutup dengan end. Satu end yang hilang membuat seluruh script tidak berjalan; membaca error menunjukkan pesan yang kamu dapat.
Langkah 2: Ubah part dari script
Script jadi berguna saat mengubah sesuatu di dunia game. Pengaturan yang kamu lihat di jendela Properties, seperti Color, Transparency atau Anchored milik part, adalah properti, dan script juga bisa mengaturnya.
- Di tab Home, klik Part. Studio menambah sebuah blok ke Workspace. Namanya tidak penting.
- Di Explorer, arahkan kursor ke part baru itu, klik + dan sisipkan Script. Ganti namanya jadi
ColourChangerdan ganti isinya dengan kode di bawah. - Tekan Play. Part berubah merah, lalu biru, lalu hijau, berganti sekali per detik, dan mulai lagi.
-- Script di dalam Part di Workspace, bernama ColourChanger.
-- Script mengubah properti yang sama dengan yang kamu lihat di jendela Properties.
-- Script ini memberi part-nya warna baru setiap detik, untuk setiap pemain.
local part = script.Parent :: BasePart -- part tempat script ini berada
local colours = {
Color3.fromRGB(255, 85, 85), -- merah
Color3.fromRGB(85, 170, 255), -- biru
Color3.fromRGB(85, 255, 127), -- hijau
}
part.Anchored = true -- part yang di-anchor tetap di tempat kamu menaruhnya
local index = 1
while true do
part.Color = colours[index]
index = index % #colours + 1 -- 1, 2, 3, lalu kembali ke 1
task.wait(1) -- berhenti satu detik (wait() yang lama sudah deprecated)
end
script.Parentadalah objek tempat script berada, di sini part-nya. Seret script ke part lain dan ia mengubah part itu.:: BasePartadalah type cast. Ia memberi tahu Script Editor bahwa parent-nya adalah part, jadi editor bisa mengecek properti yang kamu pakai. Luau memakai tipe hanya untuk peringatan dan saran, jadi cast ini tidak mengubah apa yang dilakukan baris itu.part.Colordanpart.Anchoredadalah properti yang sama dengan yang kamu lihat di jendela Properties, dengan nama yang sama. Roblox memakai ejaan Amerika, jadi properti-nyaColormeskipun script ini bernama ColourChanger.Anchored = truemembuat part diam: referensi Roblox bilang part yang di-anchor tidak pernah bergerak karena gravitasi, tabrakan atau fisika lainnya.colours[index]membaca satu item dari daftar.#coloursadalah panjang daftar, 3, dan%memberi sisa pembagian, jadiindex % #colours + 1menghitung 1, 2, 3, 1, 2, 3.while true domengulang selamanya, itulah kenapatask.wait(1)di dalamnya penting. Dokumentasi Roblox bilang selalu taruh jeda sepertitask.wait()di loop tanpa akhir: tanpa jeda, game membeku dan Studio crash.
ColourChanger adalah Script, jadi berjalan di server, dan setiap pemain di game melihat warna yang sama pada saat yang sama. Langkah 4 menunjukkan jenis script yang lain.
Langkah 3: Bereaksi pada pemain dengan event
Kebanyakan kode game menunggu sesuatu terjadi: pemain masuk, part disentuh, tombol diklik. Roblox menyebutnya event. Untuk menjalankan kode saat event terjadi, kamu menyambungkan function ke event itu.
- Sisipkan Part lain dan ganti namanya persis jadi
Pad, dengan huruf P besar. Biarkan langsung di Workspace, bukan di dalam folder atau model, karena LocalScript di Langkah 4 mencarinya di sana. - Jadikan pad datar yang bisa kamu injak, misalnya dengan mengatur
Size-nya ke6, 1, 6di jendela Properties. Pindahkan ke lantai dekat SpawnLocation dan centang Anchored supaya tidak bergeser. - Arahkan kursor ke Pad, klik +, sisipkan Script, ganti namanya jadi
TouchPaddan tempel kode di bawah. - Tekan Play dan injak pad-nya. Pad berubah kuning selama 2 detik, dan Output menyebut namamu.
-- Script di dalam Part di Workspace bernama Pad, script bernama TouchPad.
-- Event: saat pemain menginjak pad, pad menyala kuning dan Output menyebut siapa pemainnya.
-- Debounce mencegahnya berjalan berkali-kali per detik selama pemain berdiri di atasnya.
local Players = game:GetService("Players")
local pad = script.Parent :: BasePart
local COOLDOWN_SECONDS = 2
local normalColour = pad.Color
local busy = false
local function onTouched(otherPart: BasePart)
if busy then
return -- masih cooldown dari sentuhan terakhir
end
-- Karakter adalah Model yang memegang bagian tubuh (atau topi) yang menyentuh pad
local character = otherPart:FindFirstAncestorOfClass("Model")
local player = character and Players:GetPlayerFromCharacter(character)
if not player then
return -- yang menyentuh part lepas atau NPC, bukan pemain
end
busy = true
print(`{player.Name} stepped on the pad`)
pad.Color = Color3.fromRGB(255, 220, 0)
task.wait(COOLDOWN_SECONDS)
pad.Color = normalColour
busy = false
end
pad.Touched:Connect(onTouched)
| Kode | Fungsinya |
|---|---|
pad.Touched:Connect(onTouched) | Menyambungkan function ke event Touched milik pad, jadi Roblox menjalankan onTouched setiap kali sesuatu menyentuh pad, dan memberikan part yang menyentuhnya. |
otherPart | Part yang menyentuh pad: kaki, tungkai, pegangan topi, atau tool yang dipegang pemain. Ini tidak pernah pemainnya sendiri, jadi dua baris berikutnya mencari tahu milik siapa. |
otherPart:FindFirstAncestorOfClass("Model") | Naik dari part itu ke ancestor pertama yang class-nya persis Model, yaitu karakternya. Karena nama class harus cocok persis, ia melewati topi (class Accessory) dan tool yang dipegang (class Tool). |
Players:GetPlayerFromCharacter(character) | Mengembalikan Player pemilik karakter model itu, atau nil kalau bukan karakter siapa pun, seperti NPC. character and di depannya melewatkan panggilan itu kalau tidak ada model yang ditemukan, sehingga player tetap nil. |
if not player then return end | Berhenti di sini untuk apa pun yang bukan pemain. return keluar dari function lebih awal. |
Kenapa pad butuh debounce
Halaman debounce Roblox memperingatkan bahwa Touched "fires multiple times in quick succession" saat part bersentuhan, dan karakter yang berjalan punya beberapa bagian tubuh. Tanpa pengecekan, satu langkah ke pad bisa mencetak banyak baris dan memulai ulang nyala kuning berkali-kali.
Variabel busy adalah debounce-nya. Sentuhan pertama mengaturnya ke true, dan setiap sentuhan selama 2 detik berikutnya sampai di if busy then return end lalu berhenti. Setelah task.wait(COOLDOWN_SECONDS), pad kembali ke warna semula dan busy kembali ke false. COOLDOWN_SECONDS ditulis dengan huruf kapital karena itu pengaturan yang tidak berubah saat game berjalan, penamaan yang disarankan Roblox untuk konstanta.
Pad ini punya satu debounce untuk semua orang, jadi pemain kedua yang menginjak dalam 2 detik itu diabaikan. Itu tidak masalah untuk pad yang menyala. Pad yang memberi hadiah sebaiknya punya cooldown untuk setiap pemain, seperti coin pad di panduan leaderboard (dalam bahasa Inggris).
Langkah 4: LocalScript pertamamu, dan kenapa berbeda
Game yang berjalan terdiri dari satu server plus satu client untuk setiap pemain. Semua sejauh ini adalah Script, yang berjalan di server, jadi perubahannya sampai ke setiap pemain. LocalScript berjalan di perangkat satu pemain. Tekanan tombol, kamera dan menu di layar ditangani di sana, karena hanya perangkat itu yang tahu tentangnya.
- Di Explorer, buka StarterPlayer, arahkan kursor ke StarterPlayerScripts, klik + dan sisipkan LocalScript. Ganti namanya jadi
MyFirstLocalScriptdan tempel kode di bawah. - Tekan Play. Output menampilkan
Hello,dan namamu, dengan label Client. - Klik ke tampilan game dan tekan E. Pad memudar. Tekan E lagi untuk mengembalikannya.
- Selama playtest masih berjalan, klik toggle Client/Server di kontrol testing Studio untuk pindah ke salinan game milik server. Di sana pad tetap padat: server tidak pernah tahu soal perubahan itu.
-- LocalScript di StarterPlayer > StarterPlayerScripts bernama MyFirstLocalScript.
-- LocalScript berjalan di perangkat milik satu pemain. Tekan E: Pad memudar hanya di
-- layar kamu, karena perubahan part yang dibuat di sini tidak sampai ke server atau orang lain.
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
print(`Hello, {player.Name}`) -- muncul di Output, ditandai sebagai Client
UserInputService.InputBegan:Connect(function(input: InputObject, gameProcessed: boolean)
if gameProcessed then
return -- tombolnya dipakai untuk hal lain, seperti mengetik di chat
end
if input.KeyCode == Enum.KeyCode.E then
local pad = workspace:FindFirstChild("Pad")
if pad and pad:IsA("BasePart") then
pad.Transparency = if pad.Transparency == 0 then 0.6 else 0
end
end
end)
Players.LocalPlayeradalah pemain yang perangkatnya menjalankan script. Roblox mendefinisikannya hanya untuk LocalScript dan ModuleScript yang di-require olehnya, jadi kode server tidak bisa memakainya.UserInputService.InputBeganterjadi saat pemain mulai menekan tombol, mengklik atau menyentuh layar.gameProcessedbernilaitruekalau engine sudah memakai input itu, misalnya klik pada tombol atau huruf yang diketik di kolom chat, jadi script mengabaikannya.workspace:FindFirstChild("Pad")mengembalikan child bernama Pad, ataunilkalau tidak ada.pad:IsA("BasePart")mengecek bahwa itu benar-benar part sebelum script mengubahTransparency-nya.if pad.Transparency == 0 then 0.6 else 0adalah if-expression: memilih satu dari dua nilai. Transparency 0 berarti terlihat penuh dan 1 tidak terlihat.- Script sprint dengan Shift adalah LocalScript kedua yang bagus: ia mendengarkan tombol dan mengubah WalkSpeed karakter kamu.
| Jenis | Berjalan di | Perubahannya sampai ke | Pakai untuk | Biasanya ditaruh di |
|---|---|---|---|---|
| Script | Server | Setiap pemain | Aturan game: coin, damage, pintu, ronde, penyimpanan | ServerScriptService, atau di dalam part selama belajar |
| LocalScript | Perangkat satu pemain | Hanya perangkat itu, kecuali gerakan karakternya sendiri | Input, kamera, menu layar, efek untuk satu pemain | StarterPlayerScripts atau StarterGui |
| ModuleScript | Sisi mana pun yang memanggil require() padanya | Sama dengan script yang me-require-nya | Kode yang dipakai bersama beberapa script | ReplicatedStorage untuk kedua sisi, ServerScriptService untuk server saja |
Apa yang bisa diubah cheater
Anggap cheater mengendalikan semua yang ada di perangkatnya sendiri. Mereka bisa menjalankan LocalScript sendiri dan mengubah milikmu, jadi mereka bisa memudarkan pad, atau apa pun, di layar mereka sendiri. Di sini itu tidak berbahaya: efek memudar itu cuma tampilan dan tetap di perangkat mereka. Itu juga alasan kenapa apa pun yang penting diputuskan oleh Script di server.
Script server juga tidak otomatis aman. TouchPad berjalan di server, tapi perangkat setiap pemain mengendalikan fisika karakternya sendiri, dan dokumentasi keamanan Roblox mencantumkan memanipulasi kapan Touched terjadi, atau menghentikannya sama sekali, di antara hal yang bisa dilakukan client dengan part yang dikendalikannya. Untuk pad yang menyala, itu tidak masalah. Untuk pad yang membayar hadiah, cek juga sesuatu yang dilacak server sendiri, seperti aturan di panduan obby bahwa checkpoint hanya dihitung berurutan.
Langkah 5: Tes keempat script bersama
- Bersihkan Output dengan Ctrl+K (⌘K di Mac) dan tekan Play (F5). Output menampilkan delapan baris FirstScript berlabel Server, dan baris Hello kamu berlabel Client. Part ColourChanger berganti warna setiap detik.
- Injak pad-nya. Pad berubah kuning selama 2 detik dan Output menampilkan namamu dan "stepped on the pad" sekali. Terus berjalan di atasnya: baris baru muncul paling sering sekali setiap 2 detik, bukan setiap kali Touched terjadi.
- Tekan E. Pad memudar ke Transparency 0.6. Tekan E lagi dan pad padat kembali.
- Tekan Stop. Di dropdown testing pilih Server & Clients, atur 2 client dan tekan Play (atau F7). Studio membuka jendela server dan dua jendela client. Di satu client, tekan E: pad memudar di sana, sementara client lain dan server masih menampilkannya padat. Tekan End Session kalau sudah selesai.
- Rusak sesuatu dengan sengaja. Ganti nama Pad jadi
Pad2dan main. Menginjaknya tetap membuatnya kuning, karena TouchPad menemukan part-nya lewatscript.Parent, bukan lewat nama. Menekan E sekarang tidak berefek apa-apa, dan tidak ada error:FindFirstChild("Pad")mengembalikannil, dan cekif pad and ...diam-diam melewati sisanya. Tambahkanprint(pad)di baris setelahFindFirstChild, main dan tekan E: Output menampilkannil. Print seperti itu cara tercepat untuk tahu kenapa script tidak melakukan apa-apa. Stop, hapus baris print itu dan kembalikan nama part jadi Pad.
Di mana script ditaruh
Tempat script berada menentukan apakah script itu berjalan sama sekali, dan Studio tidak memperingatkan kamu kalau ia tidak akan pernah berjalan. Untuk script yang akan kamu tulis selanjutnya:
| Container | Taruh di sini | Kenapa |
|---|---|---|
| ServerScriptService | Script berisi sebagian besar aturan game kamu: hadiah, ronde, penyimpanan | Berjalan di server, dan tidak ada isi ServerScriptService yang dikirim ke pemain. |
| Di dalam part di Workspace | Script milik satu part itu, seperti ColourChanger dan TouchPad | Tidak masalah selama belajar: part-nya adalah script.Parent. Untuk proyek sungguhan, Roblox menyarankan memberi tag pada part (lihat di bawah). |
| StarterPlayerScripts, di dalam StarterPlayer | Sebagian besar LocalScript: input, kamera, efek untuk satu pemain | Setiap pemain dapat salinannya sendiri saat masuk. |
| StarterGui | LocalScript di dalam ScreenGui yang menjalankan menu di layar | Setiap pemain dapat salinan antarmukanya sendiri. |
| ReplicatedStorage | ModuleScript yang di-require kode server dan client | Kedua sisi bisa melihatnya. LocalScript, atau Script dengan pengaturan default, yang ditaruh di sini tidak pernah berjalan. |
Halaman lokasi script Roblox menyarankan untuk tidak menaruh script langsung di dalam part di Workspace sama sekali: beri tag pada part dan kerjakan semuanya dari satu ModuleScript memakai CollectionService. Script di dalam part tetap cara paling mudah untuk mulai, dan tidak masalah untuk satu atau dua objek selama belajar. Panduan pintu menunjukkan pola dengan tag, dengan satu script untuk setiap pintu, dan panduan client dan server punya tabel lengkap container mana menjalankan script apa (keduanya dalam bahasa Inggris).
Kalau ada yang salah: baca Output
Error muncul di Output dengan warna merah. Masing-masing dimulai dengan tempat kejadiannya, nama lengkap script dan nomor baris, lalu menyebut apa yang salah. Klik error-nya dan Studio membuka script itu di baris tersebut. Misalnya, kalau kamu menghapus cek if not player dari TouchPad dan part lepas jatuh ke pad, Output akan menampilkan:
Workspace.Pad.TouchPad:22: attempt to index nil with 'Name'
Kesalahan dalam cara kode ditulis, seperti end yang hilang, muncul sebelum kamu menekan Play: Script Editor memberi garis bawah merah, dan jendela Script Analysis (tombol Analysis di tab Script) mencantumkannya. Script dengan kesalahan seperti ini tidak berjalan sama sekali, bahkan baris di atasnya.
| Pesan | Artinya | Perbaikan |
|---|---|---|
Colour is not a valid member of Part "Workspace.Part" | Tidak ada apa pun dengan nama persis itu di objek tersebut. Di sini, properti-nya dieja Color. | Samakan ejaan dan huruf besarnya dengan jendela Properties atau Explorer. Lebih lanjut soal error ini. |
attempt to index nil with 'Name' | Kode membaca sesuatu, di sini .Name, dari nilai yang nil. Di contoh di atas, player bernilai nil karena part lepas menyentuh pad. | Cari tahu kenapa nilainya nil, dan cek dengan if sebelum memakainya. Lebih lanjut soal error ini. |
Expected 'end' (to close 'then' at line 2), got <eof> | if di baris 2 tidak punya end pasangannya. Untuk function, pesannya bilang to close 'function', dan <eof> berarti akhir file. | Tambahkan end yang hilang, dengan melihat baris yang disebut di dalam kurung, bukan baris terakhir. Kadang pesannya diakhiri "did you forget to close ... at line N?". Bagian itu tebakan Luau dari indentasi kamu dan bisa menunjuk blok yang salah, jadi cek baris di dalam kurung dulu. Lebih lanjut soal syntax error. |
Kalau script tidak melakukan apa-apa dan Output juga kosong, biasanya script ada di tempat yang tidak pernah menjalankannya, atau menunggu event yang tidak pernah terjadi. Panduan error script punya checklist untuk script yang diam, dan membahas lebih dalam soal membaca Output (dalam bahasa Inggris).
Apa yang dilakukan tutorial scripting lama secara berbeda
Kalau kamu juga belajar dari video dan postingan forum, kamu akan ketemu pola-pola lama. Ini yang penting, beserta alasan masing-masing jadi masalah.
| Tutorialnya | Masalahnya | Panduan ini |
|---|---|---|
Berhenti dengan wait(1) | Referensi Roblox menandai wait() global sebagai deprecated dan bilang task.wait() sudah menggantikannya. | task.wait(1) |
Mencari karakter dengan otherPart.Parent, seperti pelajaran lava milik Roblox sendiri | Saat topi atau tool yang dipegang menyentuh part, otherPart.Parent adalah Accessory atau Tool, bukan karakter, jadi tidak ada Humanoid yang ditemukan dan sentuhan itu terlewat. | FindFirstAncestorOfClass("Model"), lalu GetPlayerFromCharacter |
Memakai Touched tanpa debounce | Touched terjadi beberapa kali berturut-turut untuk satu langkah, jadi kodenya berjalan berulang-ulang. | Flag busy dan cooldown |
| Menaruh LocalScript di dalam part di Workspace | LocalScript tidak pernah berjalan di sana. Ia hanya berjalan dari tempat milik satu pemain. | LocalScript di StarterPlayerScripts (kenapa) |
Menulis part.Touched:connect(...) atau table.getn(list) | Panduan penamaan Roblox bilang API camelCase kebanyakan sudah deprecated, dan referensinya hanya mencantumkan Connect. table.getn deprecated dan diganti #list. | :Connect(...) dan #list |
| Mengubah coin atau memberi damage di LocalScript | Perubahannya tetap di perangkat pemain itu, jadi tidak ada orang lain yang melihatnya dan server tidak pernah menghitungnya. | Aturan game di Script di server |
Latihan: tiga perubahan untuk dicoba
Mengubah kode mengajarkan lebih banyak daripada membacanya. Coba ini di place kamu sendiri, satu per satu, dan tekan Play setelah masing-masing.
- Buat pad memberi poin. Tambahkan script Leaderstats dari Langkah 1 panduan leaderboard. Lalu di TouchPad, setelah
busy = true, cari folderleaderstatsmilik pemain dan tambahkan 1 ke nilaiCoins-nya. Petunjuk:player:FindFirstChild("leaderstats"), laluleaderstats:FindFirstChild("Coins"), lalucoins.Value += 1. Coin pad di panduan leaderboard adalah versi jadinya, dengan cooldown untuk setiap pemain. - Pudarkan juga color changer-nya. Buat ColourChanger juga mengubah
Transparencypart setiap detik. Petunjuk: tambahkan table kedua berisi angka antara 0 dan 1, seperti{ 0, 0.3, 0.6 }, dan aturpart.Transparencydarinya di baris setelahpart.Color, memakaiindexyang sama. - Cetak warna pad. Buat MyFirstLocalScript mencetak
Colorpad saat kamu menekan E. Petunjuk:print(pad.Color)di dalam blokif pad and pad:IsA("BasePart"). Tekan E saat pad berwarna kuning: client melihat warna yang diatur server, karena perubahan yang dibuat di server sampai ke setiap client.
Apa yang dipelajari selanjutnya
Sekarang kamu sudah memakai bagian-bagian yang menyusun sebagian besar script game. Urutan yang bagus untuk berikutnya (panduan dalam bahasa Inggris kecuali disebut lain):
- LocalScript vs Script vs ModuleScript: di mana tiap jenis script berjalan dan apa yang bisa diubahnya, lebih dalam dari Langkah 4.
- RemoteEvents: bagaimana LocalScript meminta server melakukan sesuatu, dan bagaimana server mengecek permintaannya.
- Leaderboard: stat pertamamu, dibuat dan diubah di server.
- Game pertamamu (dalam Bahasa Indonesia): coin course singkat dengan lava, coin dan finish pad, dijalankan dua script server, lalu dipublikasikan.
- Lalu pilih sistem untuk ditambahkan: GUI shop, sistem ronde, checkpoint obby, loading screen atau animasi saat tombol ditekan. Kalau ada yang rusak, panduan error script membantumu membaca pesannya.
Tutorial Coding fundamentals milik Roblox sendiri jadi pendamping yang bagus: enam seri yang berjalan dari variabel dan function lewat kondisional, loop, serta array dan dictionary sampai mengatur kode dengan ModuleScript, dengan proyek kecil untuk dibangun di Studio.
Error umum dan cara memperbaikinya
Kebanyakan masalah script pertama adalah nama yang tidak cocok, script di tempat yang salah, atau loop tanpa wait. Biarkan Output terbuka saat kamu mengetes.
Studio membeku atau tidak merespons saat aku menekan Play
Loop while true do tidak punya wait di dalamnya, jadi tidak ada hal lain yang sempat berjalan. Dokumentasi Roblox bilang loop tanpa akhir tanpa jeda seperti task.wait() membekukan game dan membuat Studio crash. Taruh task.wait() di dalam setiap loop yang berjalan selamanya, seperti di ColourChanger.
Tidak terjadi apa-apa saat aku menginjak pad
Cek bahwa TouchPad adalah Script, bukan LocalScript, langsung di dalam part Pad, tidak dinonaktifkan, dan properti CanTouch pad dicentang. Lalu jadikan print("touched", otherPart.Name) baris pertama di dalam onTouched. Kalau tidak pernah tercetak, event-nya tidak terjadi; kalau tercetak, masalahnya ada lebih ke bawah.
Menekan E tidak berefek apa-apa
MyFirstLocalScript harus LocalScript di dalam StarterPlayerScripts: LocalScript di Workspace atau ServerScriptService tidak pernah berjalan. Part-nya harus bernama persis Pad dan berada langsung di Workspace. Klik ke tampilan game dulu, dan pastikan kamu tidak sedang mengetik di chat, karena script mengabaikan tombol yang sudah dipakai game.
Part berubah di layarku tapi tidak untuk pemain lain
Perubahannya dibuat di LocalScript, jadi tetap di perangkat kamu. Buat di Script server, atau biarkan LocalScript meminta ke server lewat RemoteEvent.
ColourChanger jalan di dalam part tapi rusak di ServerScriptService
Script itu memakai script.Parent sebagai part-nya. Di ServerScriptService, parent-nya adalah ServerScriptService, yang tidak punya Anchored atau Color, jadi Output menampilkan error "not a valid member". Biarkan di dalam part, atau beri part itu nama dan cari lewat nama itu, misalnya local part = workspace:WaitForChild("ColourPart") :: BasePart.
Output tidak menampilkan apa-apa
Cek bahwa jendela Output terbuka (menu Window atau tab Script) dan tidak ada filter yang aktif: Output bisa difilter per jenis pesan, per Client atau Server, dan per teks. Kalau sudah terbuka dan tetap kosong, kemungkinan script-nya tidak pernah berjalan. Lihat checklist untuk script yang tidak melakukan apa-apa (dalam bahasa Inggris).
Keluar dari kebuntuan dengan RoCode
Kalau kamu buntu di sebuah script di place kamu sendiri, RoCode bisa membacanya bersamamu. RoCode adalah agen AI independen untuk Roblox Studio, bukan buatan Roblox: kamu mengetik di web chat, dan plugin Studio-nya membuat dan mengedit script di Explorer kamu.
Selama belajar, mode Ask yang paling berguna: kamu tetap menulis script-nya sendiri, dan RoCode membaca yang sudah ada dan menjawab pertanyaanmu tentangnya.
Jelaskan apa yang dilakukan script TouchPad di dalam part Pad, baris demi baris, dan kenapa ia memakai debounce.
- Di mode Ask, hanya memakai tool baca seperti Search Scripts dan Read Script, dan tidak mengubah apa pun di place
- Kalau ada yang perlu diperbaiki, menyebut apa yang akan diubahnya dan di mana, dan menyarankan pindah ke Build
- Pindah ke Build dan ia mengedit script di tempat, lalu mengecek compile error masing-masing dengan Check Script. Itu cek compile, bukan cek tipe atau playtest
- Membaca Output Studio dengan tool Check Output-nya, termasuk baris Server dan Client dari playtest terakhir kamu, bahkan setelah kamu menekan Stop
Di mode Build dengan plugin 3.9 atau lebih baru, RoCode bisa menjalankan playtest singkat dan membaca error-nya, dan dengan plugin 3.9.11 atau lebih baru ia bisa mengendalikan karakter tes untuk mengecek game-nya berjalan, tapi ia tidak mengambil screenshot saat game berjalan, jadi kamu tetap menginjak pad sendiri. Cara RoCode tersambung ke Studio.
Pertanyaan umum
Di mana aku menulis script di Roblox Studio?
Di Explorer, arahkan kursor ke container seperti ServerScriptService, klik tombol + dan pilih Script. Studio membukanya di Script Editor, tempat kamu mengetik Luau. Script server biasanya ditaruh di ServerScriptService; LocalScript di StarterPlayerScripts atau StarterGui.
Bagaimana cara menjalankan script di Roblox Studio?
Tekan Play (F5). Studio memulai playtest, dan setiap Script aktif di ServerScriptService atau Workspace berjalan begitu game mulai; LocalScript di StarterPlayerScripts berjalan setelah kamu masuk ke playtest. Run (pilih di dropdown di sebelah Play, atau tekan F8) memulai game tanpa avatar kamu, jadi pakai Play untuk panduan ini. Tekan Stop (Shift+F5) untuk mengakhiri tes. Untuk membuka script yang sudah ada, klik dua kali di Explorer.
Bahasa pemrograman apa yang dipakai Roblox?
Luau. Roblox menyebutnya bahasa scripting yang cepat, kecil, aman dan gradually typed yang diturunkan dari Lua 5.1, jadi kebanyakan tutorial Lua masih membantu. Luau menambah fitur seperti interpolasi string dengan backtick dan anotasi tipe opsional, dan Roblox menambah library dan objeknya sendiri, seperti task.wait.
Apa bedanya Script dan LocalScript?
Script berjalan di server, dan perubahannya sampai ke setiap pemain. LocalScript berjalan di perangkat satu pemain, untuk hal seperti input, kamera dan menu layar, dan perubahannya pada part, nilai dan antarmuka tetap di perangkat itu. Panduan client dan server (dalam bahasa Inggris) membahas keduanya, plus ModuleScript.
Bisakah aku scripting di Roblox Studio lewat HP atau iPad?
Halaman setup Roblox menyebut Studio sebagai aplikasi gratis untuk Windows dan Mac dan tidak mencantumkan versi HP atau tablet, jadi kamu butuh komputer untuk menulis script.
Kenapa script-ku tidak melakukan apa-apa dan tidak ada error?
Biasanya script ada di tempat yang tidak menjalankan jenis script itu (LocalScript di Workspace, atau Script di StarterPlayerScripts), dinonaktifkan, atau event yang ditunggunya tidak pernah terjadi. Panduan error script punya checklist (dalam bahasa Inggris).
Berapa lama belajar scripting Roblox?
Tidak ada yang bisa memberi angka yang jujur: tergantung seberapa banyak kamu membangun. Yang paling membantu adalah sering menulis script kecil di place kamu sendiri. Ubah empat script di sini, coba tugas latihannya, lalu ikuti panduan game pertama dan tambahkan satu sistem setiap kali.
Sumber dan bacaan lanjutan
- Roblox Creator Docs: Luau (dalam bahasa Inggris). apa itu Luau dan dari mana asalnya
- Roblox Creator Docs: Roblox Studio setup (dalam bahasa Inggris). Windows dan Mac, dan kebutuhan sistem
- Roblox Creator Docs: Output (dalam bahasa Inggris). membuka Output, filter, Show Context dan Show Source
- Roblox Creator Docs: Studio testing modes (dalam bahasa Inggris). Play, Run, Stop, toggle Client/Server dan Server & Clients
- Roblox Creator Docs: Script Editor (dalam bahasa Inggris). tempat script baru dibuka, dan Script Analysis
- Roblox Creator Docs: Script types and locations (dalam bahasa Inggris). di mana tiap jenis script berjalan, dan memberi tag pada part alih-alih menaruh script di dalamnya
- Roblox Creator Docs: Script (dalam bahasa Inggris). kapan Script mulai berjalan
- Roblox Creator Docs: Control structures (dalam bahasa Inggris). if statement, loop, dan kenapa loop tanpa akhir butuh wait
- Roblox Creator Docs: Events (dalam bahasa Inggris). Connect, dan apa yang diberikan Touched ke function kamu
- Roblox Creator Docs: Debounce patterns (dalam bahasa Inggris). kenapa Touched terjadi beberapa kali untuk satu sentuhan
- Roblox Creator Docs: wait (dalam bahasa Inggris). wait() global dan task.wait()
- Roblox Creator Docs: Network ownership, movement validation and physics exploits (dalam bahasa Inggris). apa yang bisa dilakukan client dengan karakternya sendiri
- Roblox Creator Docs: Coding fundamentals (dalam bahasa Inggris). seri pemula milik Roblox sendiri
Cara kode ini dicek: setiap skrip di halaman ini lolos pemeriksa tipe strict Luau dengan definisi API Roblox (luau-lsp, 26 Oktober 2026). Pemeriksaan tipe menangkap nama API yang salah ketik dan tipe yang keliru, bukan logika game, jadi uji dulu di Studio sebelum dipublikasikan.