Bir jeton koleksiyonu mekaniği oluşturun

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.


Artık 3D bir dünyaya sahip olduğunuza göre, ilk scriptinizi ekleyebilirsiniz. Bu bölümde, oyuncuların jetonları toplamasına olanak tanıyan ve jetonlar toplandıktan sonra geçici olarak devre dışı bırakılan bir jeton koleksiyonu mekaniği oluşturacaksınız.

Jetonları oluşturun

Herhangi bir şey scriptlemek için, öncelikle dünyada jetonlarınızı kullanmak için yer tutucu nesneler oluşturmanız gerekir. Önceki bölümde yaptığınız deniz yığını platformları gibi, jetonlar da basit Part nesneleri olabilir.

Jetonları oluşturun

Workspace > World içinde Jetonlar adlı yeni bir klasör oluşturun.
Jetonlar klasörünün içinde, Gold renk olarak ayarlanan, Metal malzeme olarak belirlenen, Boyut 0.6, 8, 4 olan ve Yönlendirme 90, 0, 0 ayarlanmış bir silindirik Parça adıyla Coin oluşturun.
CanCollide'ı devre dışı bırakın ve Anchored'ı etkinleştirin.
Daha sonra, Coin parçasını birkaç kez kopyalayın ve kopyaları adanın etrafına ve platformlara saçın, böylece deniz yığını seviyelerinden erişilebilir olsun.
Her bir kopyayı Coin olarak adlandırın.

Scripti oluşturun

Sonraki adımda, jetonların oyunculara yanıt vermesini sağlayacaksınız. Roblox motoru, bir şeyin bir jetona dokunduğunu algılayabilir, ancak jetonun nasıl tepki vermesi gerektiğini tanımlamak için bir script kullanmanız gerekiyor.

CoinService Oluştur

ServerScriptService içinde, aşağıdaki kod ile CoinService adında bir Script oluşturun:
```lua
-- Servisleri ve değişkenleri başlatma
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- Olay işleyicisini tanımlama
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Oyuncu bir jetona dokundu
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Oyuncu jetonu topladı")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- Olay dinleyicilerini ayarlama
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```

Artık bir oyuncu bir jetona dokunduğunda, jeton 10 saniye boyunca kaybolur ve çıktı kaydında Oyuncu jetonu topladı mesajı yazılır.

Aşağıdaki bölümler, scriptin nasıl çalıştığını daha ayrıntılı bir şekilde açıklar.

Servisleri ve değişkenleri başlatma

Diğer dillerde muhtemelen yazdığınız birçok kodda olduğu gibi, daha sonra ihtiyaç duyacağınız değişkenleri scriptin üstünde tanımlarsınız. Bizim kodumuz aşağıdakileri yapmaktadır:

  • Servis örneklerini alma - Roblox servisleri, genel özellikler için yerleşik işlevsellik sağlar. Script, önce Workspace servisinin örneklerini alarak her 3D nesneyi barındırdığı yeri elde eder ve ardından Player servisinin örneklerini alarak oyuna bağlı tüm oyuncuları yönetir ve içerir.
  • Tüm jetonların referanslarını alma - Script, 3D çalışma alanında, GetChildren() yöntemi ile jeton nesnelerinin tüm referanslarını sorgular. Bu yöntem, kendisine bağlı her nesnenin ebeveyn olduğu şeyi içeren bir dizi döner. Bu durumda, daha önce oluşturduğunuz Workspace.World.Coins klasörüdür.
  • Küresel bir değişken tanımlama - COOLDOWN değişkeni, toplandıktan sonra bir jetonun devre dışı bırakılma süresini tanımlamak için sonraki aşamalarda kullanılacaktır.
Servisleri ve Değişkenleri Başlatma

local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...

Olay işleyicisini tanımlama

Roblox Motoru, 3D dünyayı fiziksel olarak simüle eder ve görüntüleme, fizik ve ağ ile ilgili olayları işlemek için birçok mantığı yönetir. Kendi mantığınızı bazı bu olaylara scriptlemek istediğinizde, dinleyebilir ve bunları işleyebilirsiniz ve motorun geri kalanını yapmasına izin verebilirsiniz. Bu durumda, jetonlara dokunmayla ilgili olayları dinler ve işler. Script, bu olayı işlemek için onCoinTouched() yönteminde mantığı tanımlar ve aşağıdakileri gerçekleştirir:

  • Jetonun etkin olup olmadığını belirler - Her Instance'in 3D dünyada var olup olmadığını tanımlayan bir Enabled boolean niteliği vardır. Örneğin, örnek niteliklerini GetAttribute() metodu ile alabilirsiniz.
  • Bir oyuncunun jetona dokunup dokunmadığını belirler - Bir jeton etkinse, işlemci, jetona dokunan objenin gerçekten bir oyuncu olup olmadığını kontrol etmek için oyuncu hizmetini kullanır. Bir dokunuş olayı gerçekleştiğinde, Roblox motoru dokunan objeyi otherPart parametresi olarak geçer. Script, otherPart'in ebeveyninin bir oyuncuya ait olup olmadığını kontrol eder.
  • Bir oyuncu dokunduğunda jetonu devre dışı bırakır ve 10 saniye sonra yeniden etkinleştirir - Son olarak, bir oyuncu jetona dokunursa, yöntem jetonu devre dışı bırakır, 10 saniye bekler ve ardından jetonu tekrar toplamak için etkinleştirir. task.wait() kullanılmaktadır çünkü, kod yürütmesini tamamen durdurmak yerine daha iyi bir performans sunarak, diğer ipliklerdeki görevlerin eşzamanlı çalışmasına izin verir.
Olay İşleyicisini Tanımlama

local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Oyuncu bir jetona dokundu
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Oyuncu jetonu topladı")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end

Olay işleyicisini bağlama

Simüle edilen tüm 3D nesneler, BasePart'den miras alır ve dolayısıyla Touched() olayı vardır. Aşağıdaki döngü, onTouchedEvent() işleyicisini her jetonun dokunma olayına bağlar:

  • Tüm jetonların üzerinden döngü geçin - Jetonları genel bir yineleme ile döngüye alarak geçin.
  • İşleyiciyi olaya bağlayın - Döngünün her yinelemesinde, jeton varsayılan olarak etkinleştirilir, böylece oyunun başlangıcında 3D dünyada görünür. onCoinTouched() işleyici metodu da her dokunma olayı gerçekleştiğinde çalışması için jetonun Touched olayına bağlıdır. Motor dokunma algıladığında, dokunan objeyi otherPart olarak da geçer.
Olay İşleyicisini Bağlama

for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end

Mekaniği oynatın

Dropdown'dan Test seçeneğini seçin ve Play'e tıklayın. Karakterinizi bir jetona dokundurmak için hareket ettirin. Her şey çalışıyorsa, jeton kaybolur, Çıktı penceresi Oyuncu jetonu topladı mesajını gösterir ve jeton 10 saniye sonra tekrar görünür hale gelir.

Oyuncunun bir jeton topladığını gösteren stüdyonun Çıktı penceresi.
©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.