Turlar eklemek oyunu net bir başlangıç ve bitiş noktasıyla aşamalara yapılandırmanıza izin verir, böylece oyuncular ilerlemelerini ölçebilir ve eşit oynama alanı için düzenli bir fırsat elde edebilirler.Bu, takım tabanlı oyun için özellikle önemlidir, çünkü oyunculara, o tur sırasında takımlarında kimin olduğuna bağlı olarak oyun tarzlarını değiştirme şansı verir.
örnek lazer etiket deneyimi referans olarak kullanarak, bu eğitimin bu bölümü, her turu yapılandırmak için Roblox'un yerleşik özelliklerini nasıl kullanacağınızı ve yazılım yönlendirmeleri üzerine nasıl özelleştireceğinizi öğretir:
- Bireysel ve takım noktalarını sıfırlayarak bir tur başlatın, ardından oyuncuları takım doğum alanlarına yerleştirin.
- Her oyuncunun ekranının üstünde hedef belirleyen değişkenleri özelleştirme.
- Takım puanları için oyuncu nokta katkılarını izlemek.
- oyuncutakımı turu kazandı veya kaybettiğine bağlı olarak benzersiz UI ekranlarını tetiklemek.
- Oyuncuları bağlantı keserek ve onları nötr lobide oluşturarak bir turu bitirmek.
Bu bölümü tamamladıktan sonra, oyunculara doğru ve tatmin edici olan blaster davranışını nasıl uygulayacağınızı öğreneceksiniz.

Döngüyü başlat
Sunucu Kod Hizmeti > Oyunlama > Turlar > turların uygulanması için mantığın çoğunu ele alır ve bir tur döngüsünün başlangıcını işaretlemek için startRoundLoopAsync() fonksiyonunu çağırarak başlar.Oyuncular lobiye katılır ve bir takıma girmek için beklerken, startRoundLoopAsync()``resetScores() > Oyunculuk > Skorlanma > Liderlik tablosunu ve takım puanlarını sıfırlamak için çalıştırır .
Değerlendirme
function Scoring.resetScores()
for _, player in Players:GetPlayers() do
player.leaderstats.Points.Value = 0
end
for _, team in Teams:GetTeams() do
team:SetAttribute(GuiAttribute.teamPoints, 0)
end
end
Artık herkes sıfır noktadan başlıyor, sonra oluşturma konumunun Doğal özelliklerini değiştiriyor, böylece sadece oluşturma konumunun aynı özelliğine sahip oyuncular orada ortaya çıkabilir.Çünkü oluşturma konumunun özelliği örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin örneğin
Şu anda lobide bulunan oyuncular için, startRoundLoopAsync() tüm oyuncuları şu anda deneyim içinde bulunan spawnPlayersInMap işlevine aktarır ServerScriptService > Oyunlar > Rounds > spawnPlayersInMap ile herkesi yaklaşık aynı sayıda oyuncu ile bir takıma düzenlemek ve dengelemek.
Lobi grubu bir takıma dönüştürüldükten sonra deneyime katılan her yeni oyuncu için, startRoundLoopAsync() listelenen Players.PlayerAdded:Connect etkinliği dinler, ardından takıma en az oyuncu sayısıyla eklemek için spawnPlayersInMap fonksiyonunu tekrar çağırır.Bu süreç hakkında daha fazla bilgi için, eğitimin önceki Oluşturma ve Yeniden Doğma bölümünden Yeniden Doğma ve Yeniden Doğma bölümüne bakın.
Turlar
-- Haritadaki tüm oyuncuları oluştur
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- Katıldıklarında haritada yeni oyuncular oluşturun
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)
Hedef belirleyin
Artık her oyuncu arenada takım arkadaşlarıyla birlikte olduğuna göre, deneyim, tur içinde başarılı olmak için ne yapılması gerektiğine dair talimatlar vermelidir.Örnek lazer etiket deneyimi, kazanmak için takımın ne yapması gerektiğine dair net bir talimat vererek her oyuncunun ekranının üstünde bir hedef bildirimi sağlayarak bu gereksinimi ele alır.

UI Eğitiminde Hedef UI bileşeninin nasıl yapılandırılacağı ve gösterileceği konusunda daha fazla bilgi edinebilirken, bu bölüm, hedef hedefinin tur başladığında nasıl uygulanacağına odaklanır, başlayarak turu bitirmek için her takımın ihtiyaç duyduğu puan miktarı.
Çalışma sırasında hedefli istem, oyuncuların kazanmak için üç puan alması gerektiğini bilgilendirse de, StarterGui > HUDGui , yüksek puan değeri için yapılandırılabilir bir " %d " içerdiğini görebilirsiniz.

“ %d ” herhangi bir zamanda kendi oyun gereksinimlerinizi karşılamak için TEAM_SCORE_LIMIT değişkenini Yeniden Yazılabilir Depolama > TEAM_SCORE_LIMIT güncelleyerek arttırabileceğiniz veya azaltabileceğiniz bir yer tutma dizesidir.Örneğin, bu sayıyı aşırı yüksek 200 olarak ayarlarsanız, istem ve takım noktası gerektiği gibi güncellenir.
TEAM_SCORE_LIMIT Takım Skoru Sınırı
local TEAM_SCORE_LIMIT = 200 -- güncellenmiş satır, geri değiştirildiğinden emin olreturn TEAM_SCORE_LIMIT

Bu basit değişken güncellemesi, yuvarlak başladığında çalışır, ReplicatedStorage > HUDGuiSetup > SetObjective > İçeri doldurma metnini değiştirmek için UI Hedefinin nesnesindeki modül kodunu gerektirir, böylece UI Hedefindeki yer tutucu dize değiştirilebilir.
TEAM_SCORE_LIMIT Takım Skoru Sınırı
local TEAM_SCORE_LIMIT = require(ReplicatedStorage.TEAM_SCORE_LIMIT)
local function setObjective(gui: ScreenGui)
local bodyTextLabel = gui.Objective.ObjectiveDisplay.Body.BodyTextLabel
bodyTextLabel.Text = bodyTextLabel.Text:format(TEAM_SCORE_LIMIT)
end
İz noktaları
Artık oyuncuların tur için bir hedefi var, deneyim hedeflerine ulaşana kadar her takımın puanlarını takip etmelidir.Teams hizmetin varsayılan davranışı, her oyuncuyu takımının altında otomatik olarak gruplandırır ve her oyuncunun katkılarını takım puanına ekler, ancak tur tabanlı oyun için ayrı bir konumda noktaları depolamak ve izlemek önemlidir, çünkü bir oyuncu puanı alırsa, tur bitmeden önce ayrılırsa, katkıları deneyimden koparıldığında lider tablosundan kaldırılır.
Bunun gerçekleşmediğinden ve takım hedefine yönelik her katkının korunduğundan emin olmak için, Yeniden Yazılabilir Depolama > HUDGuiSetup > Takım Noktalarını Senkronize Etmeye Başla hizmetinde tüm noktalar ayrı ayrı özniteliği altında saklanır.As teamPoints artışları olarak, bu modül kodu hedef UI bileşeninde takım sayacını bulmak için startSyncingTeamPoints fonksiyonunu çağırır Class.GuiObjects .
TakımHesaplayıcı ve TakımHesaplayıcı bulunduğunda, takım oluşturma bölgeleriyle ilişkili olan özniteliğini alır, ki bu takım oluşturma noktalarıyla ilişkilidir: TeamACounter yeşil takımın noktalarını görüntüler ve TeamBCounter pembe takımın noktalarını izler.
Takım Puanları Senkronize Etmeye Başla
local function startSyncingTeamPoints(gui: ScreenGui)
for _, teamPointCounter in gui.Objective.TeamPointCounter:GetChildren() do
if not teamPointCounter:IsA("GuiObject") then
continue
end
local iconTeamColor = teamPointCounter:GetAttribute(GuiAttribute.teamColor)
Modül kodu ardından TeamACounter'ın özelliği ve TeamBCounter'ın gül rengi özelliğinin uyumlu olduğunu doğrulamak için çalışma fonksiyonunu çağırır . hizmetin altındaki karşılık gelen özellikler.Eğer öyleyse, her iki takımı da döndürür.
Takım Puanları Senkronize Etmeye Başla
local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end
Bu olay gerçekleştiğinde, startSyncingTeamPoints her iki takım sayacının TextLabel nesnelerini karşılık gelen teamPoints değerlere ayarlar ve bir oyuncu diğer takımdaki bir oyuncuyu etiketleyerek bir puan kazandığında onları güncellemeye devam eder.
Takım Puanları Senkronize Etmeye Başla
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
Bu bölümdeki her şey, şu ana kadar oyuncunun ekranındaki noktaların nasıl izleneceğine odaklandı, ancak takip noktalarını sunucuda ele alan mantığın incelenmesi önemlidir, böylece bir takım hedef hedefini karşılar ve turu kazanır.Sunucu Kript Hizmeti > Oyun > Puan kazandığında her seferinde ateşlenecek bağlanabilir bir olay oluşturarak modül kodunun başladığını görebilirsiniz, ki bu her oyuncu bir puan kazandığında ateşlenecek.
Değerlendirme
local teamScoreChangedBindable = Instance.new("BindableEvent")local Scoring = {teamScoreChanged = teamScoreChangedBindable.Event,}
Ardından aşağıdaki eylemleri yerine getiren incrementScore fonksiyonunu çağırır:
- oyunculider liderlik tablosubireysel puanını alır ve bir tane ekler.
- Daha önce bahsedilen bağlanabilir etkinliği hem oyuncunun takımı hem de puanıyla ateş eder.
Bu süreç etkili bir şekilde hem istemciyi hem de sunucuyu her oyuncunun bireysel puanları ve takım puanlarıyla ilgili olarak uyumlu tutar.
Değerlendirme
function Scoring.incrementScore(player: Player, amount: number)
local team = player.Team
assert(team, `Player {player.Name} must be on a team to score a point, but has no team`)
local teamPoints = team:GetAttribute(GuiAttribute.teamPoints)
teamPoints += amount
team:SetAttribute(GuiAttribute.teamPoints, teamPoints)
local leaderstat = player.leaderstats.Points
leaderstat.Value += amount
teamScoreChangedBindable:Fire(team, teamPoints)
end
Sonuçları görüntüle
Oyuncular birbirlerini etiketler ve takımları için puan kazanırken, Sunucu Kript Hizmeti > Oyunculuk > Turlar takımın puanı aldığı turun hedefini karşıladığını görmek için kontrol eder.Ekibinin puanı TEAM_SCORE_LIMIT değişkeninin ReplicatedStorage > TEAM_SCORE_LIMIT içinde daha düşükse, sunucu takımların birinin tekrar puan almasına kadar bekler.
Ancak, bir takımın puanı TEAM_SCORE_LIMIT değişkenine ulaştığında, senaryo oyuncunun adı ve takımıyla bir roundWinnerRemote etkinlik örneği yakar.
Turlar
-- Turun her puan sonra bitip bitmediğini kontrol etlocal team: Teamlocal score: number = 0while score < TEAM_SCORE_LIMIT doteam, score = Scoring.teamScoreChanged:Wait()end-- Kazanan takımı görüntülefor _, player in Players:GetPlayers() do-- Oyuncunun turun sonunda hangi takımda olduğunu göndermek-- çünkü oyuncunun takımı kaldırılmak üzere, bu yüzden istemci-- kendi takımını kontrol edemeyecekroundWinnerRemote:FireClient(player, team, player.Team)end
Her bir istemci listesindeki Yeniden Yazılan Depolama > RoundResultsGuiSetup > senaryosu bu roundWinnerRemote etkinliğin sesini dinler, böylece şunlar yapılabilir:
- Turun sonuçlarını ve oyuncunun kazanan takımda olup olmadığını duyuran benzersiz bir Başlangıç GUI > TurSonuçlarıGUI UI ekranı görüntüleyin
- Bir zafer veya mağlubiyet ses klibini çal.
Örneğin, bir oyuncu kazanan noktayı atan takımda ise, tur sonuçları üzerinde bir kazanma metni gösteren bir UI ekranı ve neşeli bir ses çalan bir ses klibi şeklinde çok sayıda geri bildirim alır.Tersine, bir oyuncu kazanan noktayı atan takımda değilse, kaybeden metni gösteren bir UI ekranı ve korkunç bir ses çalan bir ses klibi alırlar.
YuvarlakSonuçGuiYapılandırma
local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- Ekibimiz kazandıysa, Zaferi gösteririz! Aksi takdirde Yenilgi gösteririz...
local isVictory = winner == localTeam
if isVictory then
victorySound:Play()
victoryDefeatText = VICTORY_TEXT
else
defeatSound:Play()
victoryDefeatText = DEFEAT_TEXT
end
end
Takımları sıfırla
Aynı anda ServerScriptService > Oynanış > Turlar bir takımın tur hedefini karşıladığını ve her oyuncuya uygun UI görüntüsünü tetiklediğini doğrurken, tüm oyuncuları arenadan lobiye taşır ve onları turdan koparak her oyuncuya uygun UI görüntüsünü tetikler.Bu, turu resmi olarak bitirme ve her iki takımı sıfırlama sürecini başlatır.
Aynı mantığı Doğum Konumlarını Yapılandır , Turlar sonra, Doğal doğum konumunun Neutral doğru ayarlar, böylece oyuncular takım durumlarına rağmen orada doğabilir.Bu, lobinin oyuncuların turdan kopmasından sonra oluşturabileceği tek konum olduğu anlamına gelir.
Turlar
-- Herkesi lobiye gönderplayerAddedConnection:Disconnect()neutralSpawn.Neutral = truespawnPlayersInLobby(Players:GetPlayers())
Bir mola için on saniye bekledikten sonra, Turlar sunucu kodu daha sonra herkesin puanlarını sıfırlayıp yeni takımlara sıralayarak döngüyü yeniden başlatır.Örnek, sunucunun içinde hiçbir oyuncu olmadığına kadar bu döngüsel tur sürecini tekrar eder.
Artık oyuncular kendi takımlarıyla haritaya yerleşebilir ve tüm bir tur oynayabilirler, böylece bir sonraki bölüm, her bir patlayıcının davranışının arkasındaki senaryolar hakkında bilgi verir.