Tutorial · Dasar scripting

Belajar scripting di Roblox Studio: panduan untuk pemula

Scripting, atau ngoding, di Roblox Studio berarti menulis Luau, versi bahasa Lua milik Roblox, di script yang kamu tambahkan ke place kamu. Panduan ini mulai dari Baseplate kosong: kamu membuka jendela Output, menulis script pertama, mengubah part lewat kode, bereaksi saat pemain menginjak pad dan mencoba LocalScript, sambil belajar variabel, function, if statement, loop dan event.

Diperbarui 26 Oktober 202619 menit baca

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(), bukan wait(). Referensi Roblox menandai wait() global sebagai deprecated dan digantikan oleh task.wait().
  • Di opsi tampilan jendela Output, nyalakan Show Context supaya setiap baris menunjukkan apakah datang dari Server atau Client.
Di halaman ini
  1. Sebelum mulai
  2. 1. Script pertama
  3. 2. Ubah part
  4. 3. Event
  5. 4. LocalScript pertama
  6. 5. Tes
  7. Tempat script
  8. Baca error
  9. Tutorial lama
  10. Latihan
  11. Selanjutnya
  12. Error umum
  13. Dengan RoCode
  14. Pertanyaan umum
  15. Sumber dan bacaan lanjutan

Sebelum mulai: Studio, Baseplate dan jendela Output

IlustrasiEmpat script dalam satu playtest: part ColourChanger berganti warna setiap detik, menginjak Pad membuatnya kuning selama 2 detik untuk semua pemain dan menulis namamu di Output, dan E memudarkan Pad hanya di layar ini.

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.

  1. Pasang Roblox Studio, aplikasi gratis Roblox untuk Windows dan Mac, dan login dengan akun Roblox kamu.
  2. Buka Studio. Halaman awalnya mencantumkan template: pilih Baseplate. Kamu dapat lantai dengan tekstur grid 4x4 dan SpawnLocation, tempat avatar kamu muncul saat bermain.
  3. 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.
  4. Buka Output dari menu Window atau tab Script. Di sinilah pesan dan error dari script kamu muncul.
  5. 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.
Empat script yang akan kamu tulis
ScriptJenisTempatnyaYang diajarkan
FirstScriptScriptServerScriptServiceVariabel, function, if statement, loop dan table
ColourChangerScriptDi dalam Part di WorkspaceMengubah properti, script.Parent dan loop yang menunggu
TouchPadScriptDi dalam Part bernama PadEvent, menemukan pemain yang menyentuh part, dan debounce
MyFirstLocalScriptLocalScriptStarterPlayerScripts, di dalam StarterPlayerKode yang berjalan di perangkat satu pemain, tekanan tombol, dan apa yang tetap di perangkat itu
Explorer setelah selesai (hanya objek yang dipakai panduan ini)
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

  1. 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.
  2. 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.
  3. Script baru dimulai dengan satu baris, print("Hello world!"). Hapus lalu tempel kode di bawah.
  4. Tekan Play (F5), dengan Test terpilih di dropdown di sebelah kirinya. Studio memulai playtest dan menaruh avatar kamu di SpawnLocation.
  5. 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
-- 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.

Output (yang diharapkan)
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.

Fungsi setiap bagian FirstScript
KodeIdeArtinya
local gameName = "Coin Run"VariabelNama 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): stringFunctionBlok 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.
returnNilai kembaliMengembalikan nilai ke kode yang memanggil function. print(describe(gameName, coinsToWin)) mencetak apa pun yang dikembalikan describe.
`{name}: collect {goal} coins to win`Interpolasi stringTeks dalam backtick bisa menampung nilai: Luau mengganti {name} dan {goal} dengan nilainya saat itu.
if, elseif, else, endIf statementLuau 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 doNumeric for loopMenjalankan 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 doTable dan loopTable 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.

  1. Di tab Home, klik Part. Studio menambah sebuah blok ke Workspace. Namanya tidak penting.
  2. Di Explorer, arahkan kursor ke part baru itu, klik + dan sisipkan Script. Ganti namanya jadi ColourChanger dan ganti isinya dengan kode di bawah.
  3. Tekan Play. Part berubah merah, lalu biru, lalu hijau, berganti sekali per detik, dan mulai lagi.
Script di Part di Workspace bernama ColourChanger
-- 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.Parent adalah objek tempat script berada, di sini part-nya. Seret script ke part lain dan ia mengubah part itu.
  • :: BasePart adalah 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.Color dan part.Anchored adalah properti yang sama dengan yang kamu lihat di jendela Properties, dengan nama yang sama. Roblox memakai ejaan Amerika, jadi properti-nya Color meskipun script ini bernama ColourChanger.
  • Anchored = true membuat 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. #colours adalah panjang daftar, 3, dan % memberi sisa pembagian, jadi index % #colours + 1 menghitung 1, 2, 3, 1, 2, 3.
  • while true do mengulang selamanya, itulah kenapa task.wait(1) di dalamnya penting. Dokumentasi Roblox bilang selalu taruh jeda seperti task.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.

  1. 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.
  2. Jadikan pad datar yang bisa kamu injak, misalnya dengan mengatur Size-nya ke 6, 1, 6 di jendela Properties. Pindahkan ke lantai dekat SpawnLocation dan centang Anchored supaya tidak bergeser.
  3. Arahkan kursor ke Pad, klik +, sisipkan Script, ganti namanya jadi TouchPad dan tempel kode di bawah.
  4. Tekan Play dan injak pad-nya. Pad berubah kuning selama 2 detik, dan Output menyebut namamu.
Script di part Pad di Workspace bernama TouchPad
-- 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)
Bagaimana TouchPad sampai dari sentuhan ke pemain
KodeFungsinya
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.
otherPartPart 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 endBerhenti 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.

  1. Di Explorer, buka StarterPlayer, arahkan kursor ke StarterPlayerScripts, klik + dan sisipkan LocalScript. Ganti namanya jadi MyFirstLocalScript dan tempel kode di bawah.
  2. Tekan Play. Output menampilkan Hello, dan namamu, dengan label Client.
  3. Klik ke tampilan game dan tekan E. Pad memudar. Tekan E lagi untuk mengembalikannya.
  4. 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 StarterPlayerScripts bernama MyFirstLocalScript
-- 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.LocalPlayer adalah pemain yang perangkatnya menjalankan script. Roblox mendefinisikannya hanya untuk LocalScript dan ModuleScript yang di-require olehnya, jadi kode server tidak bisa memakainya.
  • UserInputService.InputBegan terjadi saat pemain mulai menekan tombol, mengklik atau menyentuh layar. gameProcessed bernilai true kalau 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, atau nil kalau tidak ada. pad:IsA("BasePart") mengecek bahwa itu benar-benar part sebelum script mengubah Transparency-nya.
  • if pad.Transparency == 0 then 0.6 else 0 adalah 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.
Script, LocalScript dan ModuleScript
JenisBerjalan diPerubahannya sampai kePakai untukBiasanya ditaruh di
ScriptServerSetiap pemainAturan game: coin, damage, pintu, ronde, penyimpananServerScriptService, atau di dalam part selama belajar
LocalScriptPerangkat satu pemainHanya perangkat itu, kecuali gerakan karakternya sendiriInput, kamera, menu layar, efek untuk satu pemainStarterPlayerScripts atau StarterGui
ModuleScriptSisi mana pun yang memanggil require() padanyaSama dengan script yang me-require-nyaKode yang dipakai bersama beberapa scriptReplicatedStorage 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

  1. 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.
  2. 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.
  3. Tekan E. Pad memudar ke Transparency 0.6. Tekan E lagi dan pad padat kembali.
  4. 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.
  5. Rusak sesuatu dengan sengaja. Ganti nama Pad jadi Pad2 dan main. Menginjaknya tetap membuatnya kuning, karena TouchPad menemukan part-nya lewat script.Parent, bukan lewat nama. Menekan E sekarang tidak berefek apa-apa, dan tidak ada error: FindFirstChild("Pad") mengembalikan nil, dan cek if pad and ... diam-diam melewati sisanya. Tambahkan print(pad) di baris setelah FindFirstChild, main dan tekan E: Output menampilkan nil. 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:

Tempat menaruh setiap jenis script
ContainerTaruh di siniKenapa
ServerScriptServiceScript berisi sebagian besar aturan game kamu: hadiah, ronde, penyimpananBerjalan di server, dan tidak ada isi ServerScriptService yang dikirim ke pemain.
Di dalam part di WorkspaceScript milik satu part itu, seperti ColourChanger dan TouchPadTidak masalah selama belajar: part-nya adalah script.Parent. Untuk proyek sungguhan, Roblox menyarankan memberi tag pada part (lihat di bawah).
StarterPlayerScripts, di dalam StarterPlayerSebagian besar LocalScript: input, kamera, efek untuk satu pemainSetiap pemain dapat salinannya sendiri saat masuk.
StarterGuiLocalScript di dalam ScreenGui yang menjalankan menu di layarSetiap pemain dapat salinan antarmukanya sendiri.
ReplicatedStorageModuleScript yang di-require kode server dan clientKedua 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:

Output (contoh)
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.

Tiga error yang perlu kamu kenali
PesanArtinyaPerbaikan
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.

Pola di tutorial lama, dan yang dilakukan panduan ini
TutorialnyaMasalahnyaPanduan 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 sendiriSaat 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 debounceTouched terjadi beberapa kali berturut-turut untuk satu langkah, jadi kodenya berjalan berulang-ulang.Flag busy dan cooldown
Menaruh LocalScript di dalam part di WorkspaceLocalScript 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 LocalScriptPerubahannya 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 folder leaderstats milik pemain dan tambahkan 1 ke nilai Coins-nya. Petunjuk: player:FindFirstChild("leaderstats"), lalu leaderstats:FindFirstChild("Coins"), lalu coins.Value += 1. Coin pad di panduan leaderboard adalah versi jadinya, dengan cooldown untuk setiap pemain.
  • Pudarkan juga color changer-nya. Buat ColourChanger juga mengubah Transparency part setiap detik. Petunjuk: tambahkan table kedua berisi angka antara 0 dan 1, seperti { 0, 0.3, 0.6 }, dan atur part.Transparency darinya di baris setelah part.Color, memakai index yang sama.
  • Cetak warna pad. Buat MyFirstLocalScript mencetak Color pad saat kamu menekan E. Petunjuk: print(pad.Color) di dalam blok if 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):

  1. LocalScript vs Script vs ModuleScript: di mana tiap jenis script berjalan dan apa yang bisa diubahnya, lebih dalam dari Langkah 4.
  2. RemoteEvents: bagaimana LocalScript meminta server melakukan sesuatu, dan bagaimana server mengecek permintaannya.
  3. Leaderboard: stat pertamamu, dibuat dan diubah di server.
  4. Game pertamamu (dalam Bahasa Indonesia): coin course singkat dengan lava, coin dan finish pad, dijalankan dua script server, lalu dipublikasikan.
  5. 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.

Kamu ketik

Jelaskan apa yang dilakukan script TouchPad di dalam part Pad, baris demi baris, dan kenapa ia memakai debounce.

RoCode mengerjakan
  • 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

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.

Coba RoCode di game kamu sendiri.

Kredit gratis setiap hari, tanpa kartu. Pasang plugin-nya, jelaskan fiturnya, lalu cek hasilnya di Studio.