33. Event dan Koneksi
Dalam program terminal, sesuatu terjadi karena kamu yang memanggil sebuah fungsi. Dalam game, sesuatu terjadi karena dunia berubah: sebuah part disentuh, pemain masuk, tombol diklik. Roblox menyerahkan momen-momen ini kepadamu sebagai event; kamu meresponsnya dengan menghubungkan sebuah fungsi ke event tersebut. Bab 31 sudah menunjukkan ini sekali; bab ini memantapkannya, karena ini adalah inti dari hampir semua scripting di Roblox.
Menghubungkan fungsi ke event
Sebuah event ada di dalam sebuah Instance. Hubungkan fungsi ke event
dengan :Connect, dan fungsi itu akan berjalan setiap kali
event tersebut terpicu:
local part = workspace.Coin
part.Touched:Connect(function(otherPart)
print("Something touched the coin: " .. otherPart.Name)
end)Apa yang dilakukan setiap bagiannya:
part.Touchedadalah sebuah event pada Part — event ini terpicu saat ada sesuatu yang menyentuhnya.:Connect(...)mendaftarkan fungsi tersebut. Ia tidak menjalankannya sekarang; ia mengaturnya agar berjalan nanti, setiap kali event terpicu.- Fungsi ini menerima informasi tentang apa yang terjadi — untuk
Touched, yaitu Part lain yang melakukan sentuhan.
Tidak perlu perulangan: setelah kode ini berjalan, engine Roblox akan memanggil fungsimu setiap kali event itu terjadi.
part.Touched(...) tanpa :Connect itu salah
— Touched adalah sebuah event, bukan fungsi yang kamu
panggil langsung. Selalu hubungkan ke event dengan
:Connect.
Menemukan pemain di balik sentuhan
Event Touched memberimu sebuah Part, yang biasanya
merupakan bagian dari karakter (lengan atau kaki). Untuk mendapatkan
pemain-nya, temukan model karakter tempat Part itu
berada, lalu tanyakan ke service Players:
local Players = game:GetService("Players")
part.Touched:Connect(function(otherPart)
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
print(player.Name .. " touched the coin.")
end
end)GetPlayerFromCharacter mengembalikan nil
ketika yang menyentuh bukan pemain (misalnya bata yang jatuh), jadi
pengecekan if player menjaga kode berikutnya tetap
aman.
Debounce: mencegah event terpicu terlalu cepat
Touched bisa terpicu berkali-kali dalam satu detik saat
karakter berdiri di atas sebuah Part. Kalau handler-mu memberi koin atau
poin, kamu tidak mau itu berjalan puluhan kali per sentuhan. Solusinya
adalah debounce: sebuah tanda yang bilang "sudah
ditangani".
local collected = false
part.Touched:Connect(function(otherPart)
if collected then return end -- already done; ignore extra touches
collected = true
print("Collected!")
part:Destroy()
end)Sentuhan pertama mengatur collected = true; setiap
sentuhan berikutnya langsung kena return dan tidak
melakukan apa-apa. Setelah :Connect itu sendiri, ini adalah
pola Roblox yang paling umum.
PlayerAdded: bereaksi saat seseorang bergabung
Service Players punya event PlayerAdded yang terpicu
sekali untuk setiap pemain yang bergabung. Di sinilah kamu menyiapkan
hal-hal untuk tiap pemain:
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " joined the game.")
end)Connect versus Wait
Ada dua cara untuk merespons sebuah event:
:Connect(fn)— menjalankanfnsetiap kali event terpicu, selamanya. Hampir selalu ini yang kamu inginkan.:Wait()— menghentikan script sampai event terpicu sekali, lalu melanjutkan, sambil mengembalikan informasi dari event tersebut. Gunakan hanya ketika kamu butuh satu kejadian saja.
Untuk koin yang harus bekerja pada setiap sentuhan,
:Connect adalah pilihan yang tepat. :Wait
hanya akan menangkap satu sentuhan dan berhenti mendengarkan.
PR
Lagi-lagi snippet Roblox — tulis kodenya, cek solusinya, dan coba di Studio kalau bisa.
Soal 1 — Touched printer
Buka exercises/33/homework/01-touched.lua. Dengan
variabel part yang sudah ada, hubungkan sebuah fungsi ke
event Touched-nya yang mencetak
<name> touched it, di mana <name>
adalah Name dari Part yang menyentuh.
Soal 2 — Sapa saat bergabung
Buka exercises/33/homework/02-join.lua. Menggunakan
service Players dan PlayerAdded, cetak
Welcome, <name>! setiap kali ada pemain yang
bergabung.
Soal 3 — Tambahkan debounce
Buka exercises/33/homework/03-debounce.lua. Starter
code-nya mencetak bang! di setiap sentuhan, yang terpicu
terlalu sering. Tambahkan debounce collected agar hanya
mencetak bang! sekali saja.
Tantangan — Sentuhan khusus pemain
Buka exercises/33/homework/04-player-touch.lua.
Hubungkan ke Touched pada sebuah Part. Di dalamnya, temukan
pemain di balik sentuhan dengan GetPlayerFromCharacter, dan
cetak <player> scored hanya ketika yang menyentuh
benar-benar seorang pemain (abaikan part yang bukan pemain).
Buntu atau sudah selesai? Buka halaman solusi PR.