Tur eklemek oyunun oynanışını açık bir başlangıç ve sona ile bölümlere yapılandırır, böylece oyuncular ilerlemeyi ölçebilir ve eşit bir oyun alanı için düzenli bir fırsat sağlayabilir. Bu, takım tabanlı oyun oynama açısından önemlidir, çünkü oyuncular takımınızın rolüne
Bu öğreticiyi örnek bir laser etiketi deneyimi olarak kullanarak, bu bölümde Roblox'un iç built-in özelliklerini nasıl kullanacağınızı ve her tur için kodlama rehberliğini nasıl yapacağınızı öğretir:
- Bir turu başlatmak için bireysel ve takım puanlarını sıfırlayarak, sonra oyuncuları takım oluşturma bölgelerine oluşturmak için oluştur.
- Her oyuncunun ekranının üstündeki turun hedefini ayarlayan değişkenleri özelleştiriyoruz.
- Takımınız için oyuncu puanı katkılarını takip edin.
- oyuncutakımının turu kazandığına veya kaybettiğine bağlı olarak eşsiz UI ekranlarını tetikler.
- Oyuncuları bağlantısını kesip onları nötr lobiye oluşturarak turu sonlandırıyor.
Bu bölümü tamamladıktan sonra, oyunculara hem doğru hem de tatmin edici olarak kullanılan patlayıcı davranışını uygulayabilirsiniz.
Döngüyü Başlat
ServerScriptService > Oyun > Tur > 0> Rounds0> > 3> startRoundLoopAsync() 3> > 6>
Puanlanıyor
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 yuva noktalarından baş
Şu anda lobide olan oyuncular için, startRoundLoopAsync() tüm oyuncuları deneyim içindeki tüm oyuncuları spawnPlayersInMap işlevine kadar ServerScriptService > 1>Gameplay1> > 4>Rounds4> > 7>spawnPlay
Lobi grubunun sıralandığı takıma katılan yeni oyuncular için deneyim, startRoundLoopAsync() listesi, Players.PlayerAdded:Connect etkinliğini dinler ve sonra spawnPlayersInMap işlevini tekrar
Turlar
-- Haritadaki tüm oyuncuları oluştur
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- Katılınca haritaya yeni oyuncular oluştur
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)
Hedef Belirleme
Artık her oyuncu arenada takım arkadaşlarıyla birlikte olduğunda, deneyimin tur içinde başarılı olmak için ne yapılacağına ilişkin talimatlar sağlaması gerekir. Örneğin, laser etiket deneyiminin üst kısmında her oyuncunun ekranında açık bir rehberle ne yapılacağı gerektiği konusunda net bir talimat sağlar.
Arayüz Kurumsal Eğitimindeki Hedef Kullanıcı Arayüzü bileşenini daha fazla öğrenmek için UI'yi öğrenirken bu bölümün odak noktası, hedef hedefi nasıl başlatacağını gösterirken hedef hedefi nasıl uygulanacağıdır.
Aslında oyuncu üç puan kazanmak için kazanmak için üç puanın gerektiğini bildiği için hedef çağrısında gerekli olan hedef bilgisi, StarterGui > HUDGui ile incelenirse, hedef değerinde yapılandırılabilir bir " %d" görülebilir.
“%d” bir raf değeri yükseltme veya düşürme işlemi yaparak herhangi bir anda kendi oyun gereksinimlerinizi karşılamak için kullanabilirsiniz. Örneğin, bu sayıyı aşırı derecede yükseltirseniz, özellik sayıcı ve tak
Takım_Puan_Sınırı
local TEAM_SCORE_LIMIT = 200 -- güncellenen hattı, geri dönüştüğünden emin olunreturn TEAM_SCORE_LIMIT
Bu basit değiştirici güncelleme, çalışma zamanında çalışır çünkü tur başladığında, ReplicatedStorage > HUDGuiSetup > SetObjective > 1> 4> TEAM_SCORE_LIMIT4> modülü scripti, UI Hedef'inin 7> 0>Class.Text
Takım_Puan_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
İzleme Noktaları
Oyuncular artık tur için bir hedefe sahip olduğu için deneyim, her takımın puanını takip etmelidir, onların hedefine ulaşana kadar. Her oyuncunun katkılarını ekibine eklemek ve takım puanını rapor etmek için ayrı bir yere depolandı
Bunun olmasını önlemek ve her katkıda bulunan için takım hedefine olan her katkıyı korumak için, ReplicatedStorage > HUDGuiSetup > <
TeamACounters ve TeamBCounters yerlerini bulduğunda, ekibinin teamColor özelliğini alır, bu takım oluşturma bölgeleriyle ilgilidir: TakımACounters yeşil takımın puanlarını gösterir ve TakımBCounter pemben takımın puanlarını takip eder.
Ekip Puanlarını Başlatma
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 sonra getTeamFromTeamColor işlevini çağrır ve TeamACounters'ın mint özelliği ve TeamBCounters'ın teamColor özelliği arasındaki eşleşen 2> teamColor2>
Ekip Puanlarını Başlatma
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 , hem takım sayılarının hem de TextLabel nın eşdeğer teamPoints değerlerine güncellenmesini sağlar ve bunları her oyuncu bir takımın diğer takımda görünmesi için etiketleyerek diğer takımın 1> takım puanı1> değerlerine günceller.
Ekip Puanlarını Başlatma
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
Bugüne kadar bölümdeki her şey, oyuncunun ekranındaki noktaları nasıl takip edeceğinize odaklanmıştır, ancak sunucunun takip noktalarını işleyen mantığı gözden geçirmek önemlidir, böylece bir takımın hedefe ulaştığını
Puanlanıyor
local teamScoreChangedBindable = Instance.new("BindableEvent")local Scoring = {teamScoreChanged = teamScoreChangedBindable.Event,}
Ardından incrementScore işlevini çağrı eder, bu da şu eylemleri yapar:
- Lider liderlik tablosuoyuncunun bireysel puanını alır ve bir tane ekler.
- oyuncutakımı ve skoruy ile birlikte daha önce belirlenmiş bağlayıcı olayı ateş eder.
Bu süreç, hem oyuncuların bireysel puanları hem de takımlarının puanları konusunda mükemmel bir şekilde kaydedici olarak kalır.
Puanlanıyor
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öster
Diğer oyuncuları etiketleyin ve takımınız için puan alın, ServerScriptService > Oyun > Turlar > 1> Tur hedefi1> > 4> 7>TEAM_SCORE_LIMIT7> > 0> <
Ancak, bir takımın puanı TEAM_SCORE_LIMIT değerine ulaştığında, oyuncuadını ve takımını içeren bir roundWinnerRemote etkinliği ile başlatır.
Turlar
-- Her puanın ardından turun bitip bitmediğini kontrol edinlocal team: Teamlocal score: number = 0while score < TEAM_SCORE_LIMIT doteam, score = Scoring.teamScoreChanged:Wait()end-- Kazanan takımı gösterfor _, player in Players:GetPlayers() do-- Turun sonunda oyuncunun hangi takımda olduğunu göndermek-- çünkü oyuncunun takımı kaldırılmak üzere, bu yüzden kli-- kendi takımını kontrol edemeyecekroundWinnerRemote:FireClient(player, team, player.Team)end
Her istemci listenin üzerindeki ReplicatedStorage > RoundResultsGuiSetup skript bu roundWinnerRemote etkinliğine izin verdiği için dinleniyor, böylece:
- Oyunun sonuçlarını ve oyuncu kazanan takımda ise oyunu kazanan takımın oyununu duyuran benzersiz bir StarterGui > RoundResultsGui UI ekranı gösterir.
- Bir zaferi veya yenilgiyi oynat.
Örneğin, bir oyuncunun kazanan noktayı atan takıma katılıyorsa, oyun sonuçlarının UI iletisişi ve oyun sesi ile oynanan bir oyun sesi içerir. Aksine, bir oyuncunun kazanan noktasını atmayan takıma, oyun sonuçlarının UI ekranında yenilgi metni gösteren ve oyun sesi
RoundResultsGuiYükleme
local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- Takımımız kazandıysa, Zafer'i göstereceğiz! Aksi takdirde, Yenilgi'yi göstereceğiz...
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 > Oyun > Tur > 1>Tur hedefini1> doğruladığında, bir takımın tur hedefini yerine getirdiğini ve her oyuncu için uygun UI görüntüsünü giriştirdiğini de aktarır, böylece tüm oyuncuları arenadan lobiye taşır. Bu, tur
Aynı mantığı kullanarak Oluştur Spawn Konumları, Turlar sonra Nötr oluşturma konumunun 1> 4>Class.SpawnLocation.Neutral|Neutral4> özelliğini 7> 9>doğrudan9> oyuncuların yer
Turlar
-- Herkesi lobideki herkese gönderplayerAddedConnection:Disconnect()neutralSpawn.Neutral = truespawnPlayersInLobby(Players:GetPlayers())
Bir mola için on saniye bekledikten sonra, Turlar sunucu kripti sonra herkesin puanlarını yeniden ayarlayarak döngüyü tekrar başlatır. Örnek, sunucudaki herhangi bir oyuncu yoksa kaydolur.
Oyuncular artık kendi takımlarıyla haritaya oluşturulabilir ve tüm bir tur oynayabilirler, böylece bir sonraki bölüm oyuncuların davranışının arkasındaki kodları öğretir.