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 library math.

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 = workspace

Baris 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.Touched adalah 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:

  1. Buka https://create.roblox.com/.
  2. Masuk dengan akun yang sama yang kamu pakai untuk bermain Roblox.
  3. Klik Start Creating — Studio akan diunduh dan diinstall.
  4. 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.