31. Dari Lua ke Luau — Solusi PR

Soal-soal ini tidak bisa dijalankan di terminal — semuanya adalah potongan kode Roblox. Untuk mencobanya, tempel masing-masing ke dalam Script di Roblox Studio lalu tekan Play.

Soal 1 — Temukan perbedaannya

Contoh jawaban (minimal tiga dari):

  • Lua menggunakan io.read untuk input; Luau membaca dari event dalam dunia game.
  • Lua memanggil greet secara langsung; Luau menghubungkannya ke sebuah event (Players.PlayerAdded:Connect(...)) dan membiarkan engine yang memanggilnya.
  • print(...) di Lua menulis ke terminal; di Roblox ia menulis ke panel Output di dalam Studio.
  • Luau membaca player.Name — sebuah properti dari sebuah Instance. Lua biasa tidak mengenal Instance sama sekali.
  • Luau menggunakan game:GetService("Players") untuk menemukan service Players. Lua biasa tidak punya game dan tidak punya service.

Tiga jawaban mana saja (atau yang serupa) sudah diterima. Logikanya sama; hanya infrastruktur di sekelilingnya yang berubah.

Soal 2 — Munculkan sebuah Part

Solusi lengkap.

local part = Instance.new("Part")
part.Size = Vector3.new(4, 1, 4)
part.Position = Vector3.new(0, 10, 0)
part.BrickColor = BrickColor.new("Bright red")
part.Anchored = true
part.Parent = workspace

Urutan itu penting: atur semua properti sebelum Parent. Sebuah Part akan muncul begitu ia di-parent ke workspace, jadi mengatur properti terlebih dahulu mencegah kilatan singkat dengan ukuran atau warna yang salah.

Kesalahan umum.

  • Lupa part.Anchored = true. Tanpa itu, gravitasi akan menarik Part ke bawah. Koin dan dekorasi hampir selalu perlu di-anchor.
  • Lupa Parent. Part memang ada tapi tidak masuk ke workspace, jadi tidak ada yang bisa melihatnya.

Soal 3 — Hubungkan Touched

Solusi lengkap.

part.Touched:Connect(function(other)
    print(other.Name .. " touched the part")
end)

Tiga hal yang perlu diperhatikan:

  • :Connect(...) mendaftarkan fungsinya; bukan menjalankannya. Fungsi itu baru dijalankan nanti, saat event terjadi.
  • Fungsi menerima objek yang menyentuh sebagai satu-satunya argumen — sering dinamai other, hit, atau otherPart.
  • Di Roblox, print menulis ke panel Output di dalam Studio, bukan ke terminal.

Kesalahan umum.

  • Menulis part.Touched(function ...) tanpa :Connect. Itu adalah error — Touched adalah sebuah event, bukan fungsi yang bisa dipanggil langsung.
  • Menggunakan Touched:Wait() alih-alih :Connect. :Wait() hanya menangkap satu sentuhan, lalu berhenti. Untuk event yang harus terus aktif, gunakan :Connect.

Tantangan — Part berkedip

Solusi lengkap.

local part = workspace.BlinkPart      -- assume a Part named BlinkPart

local red = BrickColor.new("Bright red")
local blue = BrickColor.new("Bright blue")

while true do
    part.BrickColor = red
    print("red")
    task.wait(1)
    part.BrickColor = blue
    print("blue")
    task.wait(1)
end

task.wait(1) menjeda script selama satu detik. Saat dijeda, Roblox tetap menjalankan semua hal lain — fisika, script lain, input pemain. Ketika satu detik selesai, script dilanjutkan dari baris setelah task.wait.

Perulangannya adalah while true karena Part seharusnya berkedip selamanya. Roblox menghentikan script saat game dihentikan, jadi kamu tidak perlu mengatur cara keluar yang bersih.

Kesalahan umum.

  • Menggunakan wait(1) versi lama (tanpa awalan task.). Masih berfungsi tapi itu adalah bentuk lama — kurang akurat dan sudah mulai ditinggalkan. Gunakan task.wait.
  • Lupa task.wait, sehingga perulangan tak terbatas mengunci Studio. Selalu letakkan wait di dalam perulangan while true.

Selesai?

Empat bab berikutnya akan membahas Roblox lebih dalam — Instances dan Explorer, Events dan koneksi, Services dan data model, serta leaderstats dan value objects — kemudian dua mini-proyek di Bagian 7, yaitu Touch-to-Collect Coin dan Collect-All-Coins, akan mewujudkan semuanya dalam scene Studio yang sesungguhnya.