Sekarang Anda memiliki dunia 3D, saatnya untuk menambahkan skrip pertama Anda. Di bagian ini, Anda akan membuat mekanik pengumpulan koin yang memungkinkan pemain mengumpulkan koin dan sementara menonaktifkan koin setelah mereka dikumpulkan.
Buat koin
Sebelum Anda dapat menulis skrip, Anda perlu memiliki objek placeholder di dunia untuk digunakan sebagai koin Anda. Seperti platform tumpukan laut yang Anda buat di bagian sebelumnya, koin dapat berupa objek Part yang sederhana.
Di Workspace > World, buat folder baru bernama Coins.
Di dalam folder Coins, buat Part silinder bernama Coin dengan BrickColor diatur ke Gold, Material diatur ke Metal, Size 0.6, 8, 4, dan Orientation 90, 0, 0.
Nonaktifkan CanCollide dan aktifkan Anchored.
Kemudian duplikat bagian Coin beberapa kali dan sebar duplikat di sekitar pulau dan di platform sehingga dapat dijangkau dari level tumpukan laut.
Pertahankan setiap duplikat bernama Coin.Buat skrip
Selanjutnya, Anda akan membuat koin merespons pemain. Mesin Roblox dapat mendeteksi ketika sesuatu menyentuh koin, tetapi Anda perlu menggunakan skrip untuk mendefinisikan bagaimana koin harus bereaksi.
Di ServerScriptService, buat Skrip bernama CoinService dengan kode berikut:
```lua
-- Menginisialisasi layanan dan variabel
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- Mendefinisikan penangan acara
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Pemain menyentuh koin
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Pemain mengumpulkan koin")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- Menyiapkan pendengar acara
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```Sekarang, setiap kali seorang pemain menyentuh koin, koin akan menghilang selama 10 detik, dan log output mencetak Pemain mengumpulkan koin.
Bagian berikut menjelaskan bagaimana skrip bekerja dengan lebih detail.
Inisialisasi layanan dan variabel
Seperti banyak kode yang mungkin Anda tulis dalam bahasa lain, Anda mendefinisikan variabel yang Anda butuhkan nanti di bagian atas skrip. Kode kami melakukan hal berikut:
- Mendapatkan referensi ke semua koin - Skrip kemudian menanyakan ruang kerja 3D untuk semua referensi ke objek koin dengan metode GetChildren(). Metode ini mengembalikan array yang berisi semua yang menjadi induk objek yang terkait, yang dalam hal ini adalah folder Workspace.World.Coins yang Anda buat sebelumnya.
- Mendefinisikan variabel global - Variabel COOLDOWN digunakan nanti untuk mendefinisikan berapa lama menonaktifkan koin setelah dikumpulkan.
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...Mendefinisikan penangan acara
Mesin Roblox secara fisik mensimulasikan dunia 3D dan menangani banyak logika untuk menangani acara terkait rendering, fisika, dan jaringan. Ketika Anda tertarik untuk menulis logika Anda sendiri selama beberapa acara ini, Anda dapat mendengarkan dan menangani mereka, sambil membiarkan mesin melakukan sisanya. Dalam hal ini, Anda mendengarkan dan menangani acara terkait koin yang disentuh. Skrip mendefinisikan logika untuk menangani acara ini dalam metode onCoinTouched(), yang melakukan hal berikut:
- Mendeteksi apakah koin diaktifkan - Setiap Instance memiliki atribut boolean Enabled yang mendefinisikan apakah objek tersebut ada di dunia 3D atau tidak. Anda dapat mendapatkan atribut instance dengan metode GetAttribute().
- Mendeteksi apakah seorang pemain menyentuh koin - Jika koin diaktifkan, metode ini menggunakan layanan pemain untuk memeriksa apakah objek yang menyentuh koin benar-benar seorang pemain. Ketika acara sentuh terjadi, Mesin Roblox meneruskan objek yang menyentuh koin sebagai parameter otherPart. Skrip memeriksa untuk melihat apakah induk dari otherPart milik seorang pemain.
- Menonaktifkan koin jika seorang pemain menyentuhnya, dan mengaktifkannya kembali setelah 10 detik - Akhirnya, jika seorang pemain menyentuh koin, metode ini menonaktifkan koin, menunggu selama 10 detik, dan kemudian mengaktifkan kembali koin untuk dikumpulkan. task.wait() digunakan sebagai pengganti wait() karena memberikan kinerja yang lebih baik dengan tidak menghentikan eksekusi kode sepenuhnya, memungkinkan tugas di thread lain berjalan secara bersamaan.
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Pemain menyentuh koin
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Pemain mengumpulkan koin")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
endHubungkan penangan acara
Semua objek 3D yang disimulasikan mewarisi dari BasePart dan oleh karena itu memiliki acara Touched(). Loop berikut menghubungkan penangan onTouchedEvent() ke setiap acara sentuh koin dengan melakukan hal berikut:
- Loop melalui semua koin - Loop melalui setiap koin menggunakan iterasi umum.
- Hubungkan penangan ke acara - Dalam setiap iterasi loop, koin diaktifkan secara default, sehingga terlihat di dunia 3D selama awal permainan. Metode penangan onCoinTouched() juga dihubungkan ke acara Touched dari koin sehingga dijalankan setiap kali acara terjadi. Ketika mesin mendeteksi sentuhan, ia juga meneruskan objek yang menyentuh objek tersebut, otherPart.
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
endUji coba mekanik
Pilih Test dari dropdown dan klik Play. Gerakkan karakter Anda untuk menyentuh koin. Jika semuanya berfungsi, koin akan menghilang, jendela Output mencetak Pemain mengumpulkan koin, dan koin muncul kembali setelah 10 detik.
