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.Touched adalah 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) — menjalankan fn setiap 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.