Tur Ekleme

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

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 olun
return 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:

  • Grabs the oyuncu's team and their current teamPoints value on the Team object in the Teams service, then adds one.
  • 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 edin
local team: Team
local score: number = 0
while score < TEAM_SCORE_LIMIT do
team, score = Scoring.teamScoreChanged:Wait()
end
-- Kazanan takımı göster
for _, 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 edemeyecek
roundWinnerRemote: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

Kazanım geri bildirimi
Geri bildirim yenilgisi
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önder
playerAddedConnection:Disconnect()
neutralSpawn.Neutral = true
spawnPlayersInLobby(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.