31. Dari Lua ke Luau
Selama ini kode kita dijalankan di terminal dengan lua.
Mulai sekarang, kode kita akan berjalan di dalam Roblox
Studio, editor yang dipakai Roblox untuk membangun pengalaman
bermain. Studio menggunakan versi Lua tersendiri yang disebut
Luau. Bab ini membahas apa yang tetap sama, apa yang
berubah, dan dari mana ide-ide barunya berasal.
Luau vs Lua: yang tetap sama
Hampir semua yang sudah kamu pelajari terbawa ke Luau tanpa perubahan:
- Tipe: nil, boolean, number, string, tabel, fungsi.
- Semua operator: aritmatika, perbandingan, logika,
..,#. local,if,elseif,else,end,while,repeat,for,break,return.- Fungsi, beberapa nilai kembalian, method, parameter
self, sintaks titik dua (colon). - Tabel sebagai list dan dictionary,
ipairs,pairs,table.insert,table.remove,#. - Metatable,
__index, pola class.new/:method. - Sebagian besar library
string(string.format,string.upper,string.gmatch, dll.) dan librarymath.
Kalau kamu bisa menulis proyek inventori di Bagian 6 dalam Lua biasa,
kode yang sama itu (minus pemanggilan io.* dan
print ke terminal) bisa langsung ditempel ke dalam skrip
Luau.
Yang berbeda
Ada tiga hal yang berubah di Roblox.
1. Di mana program berjalan
Program terminal punya satu titik masuk: file yang kamu berikan ke
lua. Sebuah pengalaman di Roblox adalah pohon
Instance — Part, Script, Folder, Model — dengan kode
yang hidup di dalam objek Script dan
LocalScript di pohon tersebut. Tidak ada
main.lua. Setiap skrip berjalan sendiri begitu Instance-nya
ada.
Ada tiga jenis objek skrip:
Script— berjalan di server; bisa mengubah dunia untuk semua pemain.LocalScript— berjalan di komputer satu pemain saja. Dipakai untuk UI, kamera, suara — apa pun yang bersifat lokal untuk satu pemain.ModuleScript— seperti modul Lua biasa dari bab 25. Mengembalikan tabel; skrip lain me-require-nya.
Mini-proyek di buku ini menggunakan satu Script (server)
dan tidak ada yang lain.
2. Objek bawaan
Luau di Roblox memberi kamu nama-nama yang tidak ada di Lua biasa:
| Nama | Artinya |
|---|---|
game |
Akar dari seluruh pengalaman. |
workspace |
Pintasan untuk game.Workspace. Menyimpan dunia. |
game.Players |
Daftar pemain yang sedang terhubung. |
script |
Skrip tempat kamu berada (objekmu sendiri). |
Instance.new(class) |
Membuat Instance baru dari class yang diberikan. |
task.wait(seconds) |
Menjeda skrip ini selama durasi yang diberikan. |
task.spawn(fn) |
Menjalankan fn di coroutine baru. |
Kamu membuat objek dengan Instance.new:
local part = Instance.new("Part")
part.Name = "Coin"
part.Size = Vector3.new(2, 0.2, 2)
part.Position = Vector3.new(0, 5, 0)
part.BrickColor = BrickColor.new("Bright yellow")
part.Anchored = true
part.Parent = workspaceBaris pertama membuat sebuah Part. Baris-baris di tengah mengatur
properties-nya. Baris terakhir menempatkannya di dalam
workspace — itulah yang membuat Part tersebut muncul di
dunia.
Vector3.new(x, y, z) dan
BrickColor.new(name) adalah fungsi factory untuk tipe nilai
Roblox. Seperti Instance.new, keduanya hanya mengembalikan
sebuah nilai.
3. Event
Di program terminal, sesuatu terjadi karena kamu yang meminta: kamu memanggil sebuah fungsi, lalu fungsi itu berjalan. Di dalam game, sesuatu terjadi karena dunia berubah: sebuah tombol ditekan, sebuah part disentuh, seorang pemain bergabung. Roblox mengekspos momen-momen ini sebagai event. Hubungkan sebuah fungsi ke sebuah event, dan fungsi itu akan berjalan setiap kali event tersebut terpicu.
local part = workspace.Coin
part.Touched:Connect(function(other)
print("Something touched the coin: " .. other.Name)
end)Penjelasannya:
part.Touchedadalah sebuah event pada Part.:Connect(...)mendaftarkan sebuah fungsi untuk berjalan ketika event tersebut terpicu.- Fungsi itu menerima satu argumen — Part lain yang menyentuhnya.
- Skrip terus berjalan setelah itu (tidak perlu perulangan); setiap
kali ada Part yang menabrak
part, fungsi tersebut akan berjalan.
Inilah bagian dari Luau yang paling berbeda dari Lua biasa. Begitu kamu paham, sebagian besar pemrograman Roblox tinggal tulis fungsi; hubungkan ke event yang tepat.
Berdampingan: logika sama, dua cara berbeda
Sebuah fungsi yang mencetak salam, dua kali:
-- Plain Lua (terminal)
local function greet(name)
print("Hello, " .. name)
end
greet("Keiko")
greet("Roblox")Fungsi yang sama dalam sebuah Roblox Script, dipanggil ketika pemain bergabung:
-- Roblox Luau (Script in ServerScriptService)
local Players = game:GetService("Players")
local function greet(name)
print("Hello, " .. name)
end
Players.PlayerAdded:Connect(function(player)
greet(player.Name)
end)Fungsi greet itu identik. Hanya pemicunya yang
berubah: di terminal kamu memanggil greet sendiri; di
Roblox, engine yang memanggilnya setiap kali seorang pemain
bergabung.
game:GetService("Players") adalah cara idiomatis untuk
mengakses service Players. game.Players juga bisa, tapi
:GetService adalah bentuk yang digunakan dokumentasi
Roblox, dan lebih aman jika sebuah service belum selesai dimuat.
Menginstall Roblox Studio
Untuk menjalankan apa pun di Bagian 7, kamu butuh Roblox Studio, yang bisa diunduh gratis:
- Buka https://create.roblox.com/.
- Masuk dengan akun yang sama yang kamu pakai untuk bermain Roblox.
- Klik Start Creating — Studio akan diunduh dan diinstall.
- Buka Studio dan pilih template Baseplate.
Sebuah papan abu-abu datar akan terbuka. Panel kiri adalah
Explorer (pohon Instance), panel kanan menampilkan
Properties dari item yang dipilih, dan bagian bawah
adalah panel Output — tempat keluaran
print muncul.
Empat bab berikutnya menggali lebih dalam tentang Studio — Instance, event, service, leaderstats — lalu mini-proyek Bagian 7 menyatukannya menjadi scene yang nyata dan bisa dimainkan.
PR
Sebagian besar PR sampai sekarang dijalankan di terminal. Beberapa ke depannya hanya bisa dijalankan dengan Studio yang terbuka, jadi anggap saja sebagai latihan dengan kertas dan pena: tulis kodenya, lalu cek halaman solusinya.
Soal 1 — Temukan perbedaannya
Buka exercises/31/homework/01-spot-the-difference.lua.
File itu berisi dua cuplikan yang dipisahkan oleh sebuah komentar (satu
Lua biasa, satu Roblox Luau). Tuliskan setidaknya tiga perbedaan dalam
komentar multi-baris di bagian bawah file.
Soal 2 — Buat Part muncul
Buka exercises/31/homework/02-make-a-part.lua. Tulis
sebuah skrip (tidak perlu fungsi) yang membuat Part berwarna merah
berukuran 4 x 1 x 4 di posisi 0, 10, 0, dengan
Anchored dan parent-nya adalah workspace. Di Studio, skrip
ini akan ditempatkan di dalam sebuah Script di
ServerScriptService.
Soal 3 — Hubungkan Touched
Buka exercises/31/homework/03-wire-up-touched.lua.
Diberikan sebuah variabel part yang mengacu pada sebuah
Part, tulis cuplikan kode yang menghubungkan sebuah fungsi ke event
Touched pada Part tersebut. Fungsi itu harus mencetak
<otherName> touched the part, di mana
<otherName> adalah Name dari Part lain
yang menyentuhnya.
Tantangan — Part berkedip
Buka exercises/31/homework/04-blink.lua. Di dalam sebuah
perulangan while true do ... end, ganti
BrickColor sebuah Part antara dua warna setiap detik
menggunakan task.wait(1). Cetak satu baris pada setiap
pergantian agar panel Output menampilkan progresnya.
Buntu atau sudah selesai? Buka halaman solusi PR.