Bu proje, dokunulduğunda parça renginin ne olduğuna göre lider tahtasındaki puanları artıran veya azaltan bir parça oluşturmak için koşullu ifadeleri kullanacaktır. Mavi olduğunda, oyunculara birkaç puan verecektir. Yeşil olduğunda, çok sayıda puan verecektir. Son olarak, kırmızı olduğunda, puan alacaktır.
Projeyi ayarlama
Puan veren parça, puanların ilgili olduğu herhangi bir projeye eklenebilir. Örneğin, oyuncuların puan topladığı bir macera oyunu.
Puan izleme
Bu projeyi ayarlamak için, puanları takip etmek için bir lider tahtasına ve renk değiştiren bir parçaya ihtiyacınız olacak. Lider tahtası için gereken kod sağlanacaktır.
ServerScriptService altında Leaderboard adında yeni bir script oluşturun. Aşağıdaki kodu script'e kopyalayıp yapıştırın.
--ServerScriptService içinde, aşağıdaki içeriğe sahip PlayerSetup adında bir script oluşturun.local Players = game:GetService("Players")local function onPlayerJoin(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = player-- Bir IntValue örneğilocal points = Instance.new("IntValue")points.Name = "Points"points.Value = 0points.Parent = leaderstatsend-- PlayerAdded olayı tetiklendiğinde onPlayerJoin'u çalıştırPlayers.PlayerAdded:Connect(onPlayerJoin)
Renk değiştiren parça
Script, parçanın üç farklı renginden dönecektir. Her bir rengin RGB değerini depolamak için bir değişkeni olacak, bu renk değerleri renkleri oluşturan üç sayıdan (kırmızı, yeşil, mavi) oluşan bir veri türüdür.
PointPart adında bir parça ve PointScript adında bağlı bir script oluşturun.
PointScript içerisinde script.Parent kullanarak parçaya referans verin.
local pointPart = script.ParentFarklı renkleri depolamak için değişkenler oluşturun. Her bir değişken Color3.fromRGB() ile ayarlanmalı, bu da bir renk değeri oluşturmaktadır.
- Mavi (Biraz Puan): (0, 0, 255)
- Yeşil (Çok Puan): (0, 255, 0)
- Kırmızı (Puan Kaybet): (255, 0, 0)
local pointPart = script.Parent-- Renklerlocal blue = Color3.fromRGB(0, 0, 255)local green = Color3.fromRGB(0, 255, 0)local red = Color3.fromRGB(255, 0, 0)Küçük bir puan tutarını, daha büyük bir puan tutarını ve puan kaybetmek için üçüncü bir değişken ekleyin.
-- Renklerlocal blue = Color3.fromRGB(0, 0, 255)local green = Color3.fromRGB(0, 255, 0)local red = Color3.fromRGB(255, 0, 0)-- Puan değerlerilocal smallPoints = 10local largePoints = 50local losePoints = 100
Oyuncular servisini ekleme
Puan vermek için, Explorer'da Oyuncular altında saklı olan oyuncu bilgilerine erişmeniz gerekecek ve bu, karakter nesnesinden ayrı. Bilgilerin, lider tahtası gibi bilgiler burada bulunacaktır.
Script'inize Players servisinin eklenmesiyle bunu yapabilirsiniz. Servisler, Roblox mühendisleri tarafından zamanınızı kurtarmak için oluşturulmuş ek, önceden tanımlı fonksiyon setleridir.
Players servisini almak için şunu yazın:
local Players = game:GetService("Players")
-- Puan değerlerilocal smallPoints = 10local largePoints = 50local losePoints = 100-- Gerekli servislerlocal Players = game:GetService("Players")
Fonksiyonlar ve olaylar
PointsScript, iki fonksiyona ihtiyaç duyacaktır. İlk fonksiyon puanları verecek ve kaldıracaktır. İkinci fonksiyon ise bir oyuncunun parçaya dokunup dokunmadığını kontrol edecektir. Bu fonksiyonlar, bu parçaya dokunulduğunda tetiklenecek bir dokunma olayı ile bağlanacaktır.
givePoints() adında yeni bir fonksiyon oluşturun ve bir parametre olan player ekleyin. İçerisine test için kullanılacak bir print ifadesi ekleyin.
local Players = game:GetService("Players")-- Puan verir veya puan azaltırlocal function givePoints(player)print("Oyuncuya puan veriliyor")endBunun altına, otherPart adında bir parametreye sahip partTouched() adında ikinci bir fonksiyon oluşturun.
-- Puan verir veya puan azaltırlocal function givePoints(player)print("Oyuncuya puan veriliyor")end-- Oyuncunun parçaya dokunup dokunmadığını kontrol ederlocal function partTouched(otherPart)endFonksiyonun içerisinde, GetPlayerFromCharacter() fonksiyonunu kullanarak otherPart değişkeninde bir oyuncunun olup olmadığını kontrol edin.
-- Oyuncunun parçaya dokunup dokunmadığını kontrol ederlocal function partTouched(otherPart)local player = Players:GetPlayerFromCharacter(otherPart.Parent)endEğer bir oyuncu parçaya dokunduysa, oyuncu değişkeninde saklanacaktır. Eğer dokunmadıysa, değişken boş kalacaktır. Kendi başınıza:
- Fonksiyonun içerisinde, oyuncunun bir değere sahip olup olmadığını kontrol edin. Eğer varsa, givePoints(player) fonksiyonunu çağırın.
- Fonksiyonun altına, partTouched() fonksiyonunu pointPart'ın Touched olayına bağlayın.
-- Oyuncunun parçaya dokunup dokunmadığını kontrol ederlocal function partTouched(otherPart)-- Parçaya dokunan oyuncuyu alırlocal player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)Projeyi çalıştırın. Bir oyuncu parçaya dokunduğunda, Çıktı penceresinde "Oyuncuya puan veriliyor" mesajını görmelisiniz.
Hata Ayıklama İpuçları:
- game:GetService("Players") içindeki "Players"'ın büyük harflerle yazıldığından ve tırnak içerisinde olduğundan emin olun.
- partTouched() fonksiyonu, pointPart'ın Touched olayına bağlanmış olmalıdır.
Renk Döngüsü Oluşturma
Renkler arasında döngü yapmak için script, parçanın rengini her birkaç saniyede bir değiştiren bir while döngüsü kullanacaktır. Bu döngünün koşulu true olacağı için, sürekli çalışabilir.
Script'in sonuna, koşulu true olan yeni bir while döngüsü oluşturun, bu da döngünün her zaman çalıştığı anlamına gelir.
-- Oyuncunun parçaya dokunup dokunmadığını kontrol ederlocal function partTouched(otherPart)-- Parçaya dokunan oyuncuyu alırlocal player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)-- Renkler arasında dönerwhile true doendKendinize, pointPart'ı oluşturduğunuz renk değişkenlerine değiştiren bir while true do döngüsü kodlayın. Renkler arasında task.wait() kullanmayı unutmayın. Bitirdikten sonra, kodunuzu aşağıdaki versiyonla karşılaştırın.
-- 3 renk arasında döner, her renk arasında beklerwhile true dopointPart.Color = bluetask.wait(3)pointPart.Color = greentask.wait(2)pointPart.Color = redtask.wait(1)endOyunu test edin ve tüm üç rengin durmaksızın döndüğünden emin olun.

Hata Ayıklama İpuçları
Bu noktada, renk döngüsü beklendiği gibi çalışmıyorsa, aşağıdakilerden birini deneyin.
- While döngüsünün script'in en altına yerleştirildiğini kontrol edin, Touched olayının altına. Eğer döngü altta değilse, script'in diğer kısımlarının doğru çalışmasını engelleyecektir.
- Her bir rengin Color3.fromRGB() içerisindeki doğru yazıldığını kontrol edin. 0 ile 255 arasında, virgül ile ayrılmış üç sayı olmalıdır, örneğin (255, 50, 0) gibi.
Oyunculara puan verme
Oyunculara, dokunduklarında parçanın o anki rengine göre puan verilecektir.
Geçerli rengi bulma
Her zaman bir oyuncu parçaya dokunduğunda, script'in ileride puan vermesi için parçanın geçerli rengini bilmesi gerekecek.
givePoints() fonksiyonunu bulun. Test mesajınızı pointPart'ın geçerli rengi için bir değişken ile değiştireceksiniz. Bu değişken, oyuncunun ne kadar puan alacağını (veya kaybedeceğini) belirleyecektir.
local function givePoints(player)local currentColor = pointPart.ColorendBir oyuncunun puanlarını etkilemek için, o fonksiyonun oyuncunun lider tahtasına erişimi olması gerekir. Bunun için onu depolamak için bir değişken oluşturun.
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")endŞimdi, oyuncunun Puan değerini almak için değişken ekleyin, bu da onların lider tahtasının bir çocuğudur.
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")local playerPoints = playerStats:WaitForChild("Points")end
Puan verme veya puan kaybettirme
Sonraki adımda, dokunulduğunda parçanın rengine bağlı olarak puan vermek veya puan almak için if ve elseif kullanacaksınız. Unutmayın ki mavi az miktarda, yeşil çok, kırmızı ise puan azalmasına neden olur.
givePoints() içinde, değişkenlerin altında, geçerli rengin mavi olup olmadığını kontrol etmek için bir if ifadesi kullanın ve eğer öyleyse, smallPoints değerini oyuncunun mevcut puan değerine ekleyin.
local function givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")local playerPoints = playerStats:WaitForChild("Points")if currentColor == blue thenplayerPoints.Value += smallPointsendendYeşil rengini kontrol etmek için bir else if koşulu ekleyin. Eğer yeşil ise, o zaman oyuncunun puanına largePoints değişkenini ekleyin.
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointsendEğer pointsPart ne mavi ne de yeşil ise puanları azaltmak için bir else ifadesi kullanın.
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsendSon olarak, if ifadesinin altında parçayı yok edin ki script sürekli olarak puan vermesin.
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsendpointPart:Destroy()Oyunu test edin ve her bir rengin beklendiği gibi puan verip vermediğini kontrol edin. Tüm üç durumu test etmeyi unutmayın.
Oyunculara geri bildirim verme
PointPart çalışıyor, ancak oyuncular bir şeyin olup olmadığını ancak lider tahtalarına bakıldığında fark edebilirler. Bu durumu, PointPart yok edildiğinde partiküller yaratarak düzeltin.
Bir parçayla etkileşimlerde, sesler, sarsıntılar veya parçacıklar eklemek, oyuncular için nesnelerle etkileşimi daha tatmin edici kılar.
Bir parçacık etkisi oluşturma
Parçacık etkisi, dokunulduğunda parçanın rengiyle aynı olacaktır. Renkler değişkenlerde saklandığı için, bunları yeniden kullanmak kolaydır.
givePoints() içerisinde, en altta yeni bir ParticleEmitter örneği oluşturun. Örneğin adının tam yazımına dikkat edin.
local particle = Instance.new("ParticleEmitter")endParticleEmitter'lar, Color özelliğini kontrol etmek için renk dizileri kullanır. Yeni bir ColorSequence oluşturun ve mevcut parça rengini geçirin.
-- Parçayı yok etpointPart:Destroy()-- Parçacıkları oluşturlocal particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)Parçacığın, dokunan oyuncunun karakterine ait olması gerekir. Oyuncunun Karakter modelini almak için bir değişken oluşturun. Ardından, parçacığı oyuncunun başına iliştirin.
local particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)local playerCharacter = player.Characterparticle.Parent = playerCharacter:WaitForChild("Head")Bir saniye beklemek için task.wait() kullanın, ardından parçacıkları yok edin.
local particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)local playerCharacter = player.Characterparticle.Parent = playerCharacter:WaitForChild("Head")task.wait(1)particle:Destroy()Oyunu test edin ve her rengin dokunulduğunda tüm parçacıkların oyuncunun arkasından kısa bir süre peşinden gitmesini sağlayın.
Hata ayıklama ipuçları
Bu noktada, partiküller beklenildiği gibi çalışmıyorsa, aşağıdakilerden birini deneyin.
- Yeni bir örnek oluşturduğunuzda, ParticleEmitter'in tam olarak gösterildiği gibi yazıldığından ve tırnak işareti içinde olduğundan emin olun.
- Parçacıkları iliştirirken, playerCharacter ile WaitForChild() arasında : kullandığınızdan ve arada boşluk olmadığından emin olun.
Tam PointScript
Tamamen bitmiş bir script sürümüne aşağıdan erişebilirsiniz.
local pointPart = script.Parent
--local storage = game:GetService("ServerStorage")
-- Birkaç puan verir
local blue = Color3.fromRGB(0, 0, 255)
-- Daha fazla puan verir
local green = Color3.fromRGB(0, 255, 0)
-- Oyuncuların puan kaybetmesine neden olur
local red = Color3.fromRGB(255, 0, 0)
-- Oyunculara verilen puan
local smallPoints = 10
local largePoints = 50
local losePoints = 100
local Players = game:GetService("Players")
local function givePoints(player)
local currentColor = pointPart.Color
local playerStats = player:WaitForChild("leaderstats")
local playerPoints = playerStats:WaitForChild("Points")
-- Parçanın rengine göre oyuncuya puan verir
if currentColor == blue then
playerPoints.Value += smallPoints
elseif currentColor == green then
playerPoints.Value += largePoints
else
playerPoints.Value -= losePoints
end
-- Parçayı yok et, bir saniye bekle ve sonra parçacığı yok et
pointPart:Destroy()
-- Bir ışıltı efekti oluşturur ve yok eder
local playerCharacter = player.Character
local particle = Instance.new("ParticleEmitter")
particle.Color = ColorSequence.new(currentColor)
particle.Parent = playerCharacter:WaitForChild("Head")
task.wait(1)
particle:Destroy()
end
local function partTouched(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player then
givePoints(player)
end
end
pointPart.Touched:Connect(partTouched)
-- Değişkenlere bağlı olarak parçanın rengini değiştirir. Script'in en altında olmalıdır.
while true do
pointPart.Color = blue
task.wait(4)
pointPart.Color = green
task.wait(3)
pointPart.Color = red
task.wait(2)
end