Menambahkan Putaran

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Menambahkan putaran memungkinkan Anda untuk menstrukturkan permainan ke dalam fase dengan titik awal dan akhir yang jelas sehingga pemain dapat mengukur kemajuan mereka dan memiliki kesempatan periode untuk ruang permainan yang sama. Ini sangat penting untuk gameplay berbasis tim karena menawarkan pemain kesempatan untuk beralih gaya bermain mereka tergantung pada siapa di tim mereka selama putaran itu.

Menggunakan sample laser tag experience sebagai referensi, bagian ini dari tutorial menunjukkan cara menggunakan dan menyesuaikan fitur bawaan Roblox untuk menyajikan setiap putaran, termasuk panduan pemrograman tentang:

  • Memulai putaran dengan mengatur ulang poin individu dan tim, lalu menelurkan pemain ke zona bertelur mereka.
  • Mengubah variabel yang menetapkan tujuan untuk putaran di bagian atas setiap layar pemain.
  • Melacak kontribusi poin pemain untuk skor tim mereka.
  • Mengaktifkan layar UI unik tergantung pada apakah tim pemain menang atau kalah putaran.
  • Menyelesaikan putaran dengan mengputuskan pemain dan menelurkan mereka di lobi netral.

Setelah Anda menyelesaikan bagian ini, Anda akan belajar cara menerapkan perilaku blaster yang akurat dan memuaskan kepada pemain.

Mulai Loop

ServerScriptService > Gameplay > Rounds > 0> startRoundLoopAsync()0> fungsi untuk meng implementasikan put

Skoring

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

Sekarang semua orang mulai dengan poin nol

Untuk pemain yang saat ini berada di lobi, startRoundLoopAsync() melewati semua pemain saat ini dalam pengalaman ke fungsi spawnPlayersInMap di ServerScriptService > 1> Gameplay1> > 4> Rounds4> > 7> spawnPlayersInMap

Untuk pemain baru yang bergabung dengan pengalaman setelah kelompok lobi diurutkan menjadi tim, startRoundLoopAsync() mendengarkan acara Players.PlayerAdded:Connect , lalu memanggil fungsi spawnPlayersIn

Putaran

-- Bawa semua pemain ke peta
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- Buat pemain baru di peta saat mereka bergabung
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)

Tetapkan Tujuan

Sekarang setiap pemain berada di arena dengan rekan satu tim mereka, pengalaman perlu memberikan instruksi tentang apa yang harus dilakukan untuk berhasil dalam putaran. Samples pengalaman laser tag menangani persyaratan ini dengan memberikan prompt objektif di bagian atas setiap pemain's screen dengan panduan yang jelas tentang apa yang dibutuhkan tim untuk menang.

Sementara Anda dapat belajar lebih lanjut tentang cara mengkonfigurasi dan menampilkan komponen Objektif UI dalam UI Curriculum, bagian ini berfokus pada cara menerapkan tujuan tujuan sebagai putaran dimulai, dimulai dengan cara menetapkan jumlah poin setiap tim yang perlu untuk menyelesaikan putaran.

Meskipun petunjuk tujuan saat dijalankan memberi tahu pemain bahwa mereka perlu mencetak tiga poin untuk menang, jika Anda mengeksaminya di StarterGui > HUDGui , Anda dapat melihat bahwa itu sebenarnya berisi konfigurasi " %d" untuk nilai poin.

“%d%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score_limit%dteam_score

Skor Tim

local TEAM_SCORE_LIMIT = 200 -- baris yang diperbarui, pastikan untuk mengubah kembali
return TEAM_SCORE_LIMIT

Update variabel sederhana ini bekerja pada waktu pemuatan karena saat putaran dimulai, ReplicatedStorage > HUDGuiSetup > SetObjective > 1> TEAM_SCORE_LIMIT1> > 4> script modulnya, sehingga dapat bertukar string pengganti di objek Tujuan UI 7>Class.TextLabel7> .

Skor Tim

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

Poin Jalur

Sekarang para pemain memiliki tujuan untuk putaran, pengalaman perlu melacak poin setiap tim sampai mereka mencapai tujuan mereka. Sementara layanan Teams default mereka secara otomatis mengumpulkan setiap pemain di bawah tim mereka dan menambahkan setiap kontribusi pemain ke

Untuk menjamin agar ini tidak terjadi dan setiap kontribusi terhadap tujuan tim dipertahankan, ReplicatedStorage > HUDGuiSetup > StartSyncingTeamPoints</

Ketika menemukan TeamACounter dan TeamBCounter , mendapatkan属性 mereka teamColor , yang berkorelasi dengan zona spawan tim: TeamACCounter menunjukkan poin tim hijau, dan TeamBCounter menunjukkan poin tim merah muda.

Memulai Sinkronisasi Tim

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)

Skrip modul kemudian menyebutkan fungsi getTeamFromTeamColor untuk menyediakan bahwa属性 TeamACount's mint dan TeamBCount's teamColor 属性 dan nilai 1> teamColor1> di b

Memulai Sinkronisasi Tim

local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end

Ketika ini terjadi, startSyncingTeamPoints menetapkan kedua objek counter tim mereka ' TextLabel ke objek counter tim yang sesuai mereka, dan terus mengaktualisasi mereka setiap kali seorang pemain mencetak poin dengan menandai pemain lain di tim yang berlawanan.

Memulai Sinkronisasi Tim

teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)

Semua yang ada di bagian ini sejauh ini telah berkonsentrasi pada cara melacak poin di layar pemain, tetapi penting untuk meninjau logika yang menangani poin melacak di server sehingga tahu kapan tim mencapai tujuan tertentu dan memenangkan putaran. Jika Anda mengunjungi ServerScriptService >

Skoring

local teamScoreChangedBindable = Instance.new("BindableEvent")
local Scoring = {
teamScoreChanged = teamScoreChangedBindable.Event,
}

Itu kemudian memanggil fungsi incrementScore, yang melakukan tindakan berikut:

  • Mengambil tim pemain dan tim mereka saat ini di objek Team dalam layanan Teams, lalu menambahkan satu.
  • Mengambil skor individual pemain di papan peringkat, dan menambahkan satu.
  • Mengaktifkan acara yang dapat dipicu sebelumnya dengan kedua tim pemain dan skor mereka.

Proses ini secara efektif menjaga kedua klien dan server beriringan dalam hal skor individu pemain dan skor tim mereka.

Skoring

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

Menampilkan Hasil

Saat pemain tag satu sama lain dan mencetak poin untuk tim mereka, ServerScriptService > Gameplay > Rounds memeriksa apakah tim yang mencetak memenuhi tujuan putaran. Jika tim mereka menghasilkan lebih rendah dari variabel 1>

Namun, setelah skor tim mencapai variabel TEAM_SCORE_LIMIT, skrip mengeksekusi instans acara roundWinnerRemote dengan nama pemain dan tim mereka.

Putaran

-- Periksa apakah putaran telah selesai setelah setiap skor
local team: Team
local score: number = 0
while score < TEAM_SCORE_LIMIT do
team, score = Scoring.teamScoreChanged:Wait()
end
-- Tampilkan tim pemenang
for _, player in Players:GetPlayers() do
-- Mengirim tim mana yang dimainkan pada akhir putaran
-- karena tim pemain akan dihapus, jadi klien
-- tidak akan dapat memeriksa timnya sendiri
roundWinnerRemote:FireClient(player, team, player.Team)
end

Skrip ReplicatedStorage > RoundResultsGuiSetup di setiap daftar klien mendengarkan acara roundWinnerRemote ini sehingga itu bisa:

  • Tampilkan layar StarterGui > RoundResultsGui UI yang mengumumkan hasil putaran dan jika pemain berada di tim menang.
  • Mainkan klip audio menang atau kalah.

Misalnya, jika seorang pemain adalah pada tim yang mencetak poin kemenangan, mereka menerima beberapa bentuk umpan balik tentang hasil putaran dalam bentuk UI yang menunjukkan teks kemenangan, dan klip audio yang memutar suara gembira. Secara diam-diam, jika seorang pemain tidak ada di tim yang mencetak poin kemenangan, mereka menerima UI screen yang menunjukkan teks kalah

Umpan balik kemenangan
Kalahkan umpan balik
Jadwal Hasil Bulan

local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- Jika tim kami menang, kami akan menunjukkan Kemenangan! Jika tidak, tampilkan Kekalahan...
local isVictory = winner == localTeam
if isVictory then
victorySound:Play()
victoryDefeatText = VICTORY_TEXT
else
defeatSound:Play()
victoryDefeatText = DEFEAT_TEXT
end
end

Atur Ulang Tim

Pada saat yang sama bahwa ServerScriptService > Gameplay > Rounds verifikasi bahwa tim mencapai tujuan putaran dan mengaktifkan UI yang sesuai untuk setiap pemain, itu juga mengirim semua pemain dari arena ke lobi dengan terputus dari putaran. Ini memulai proses secara resmi mengakhiri putaran dan mengatur kembali kedua tim.

Menggunakan logika yang sama di Konfigurasi Lokasi Pemunculan , Rounds ثم ي설정 لو Neutral 위치 lokasi spawn's 1> Class.SpawnLocation.Neutral|Neutral1> property ke 4> true4> sehingga pemain dap

Putaran

-- Kirim semua orang ke lobi
playerAddedConnection:Disconnect()
neutralSpawn.Neutral = true
spawnPlayersInLobby(Players:GetPlayers())

Setelah menunggu sepuluh detik untuk istirahat, server Rounds kemudian memulai siklus lagi dengan mengatur ulang skrip setiap skor dan mengurutkannya menjadi tim baru. Sampel ini mengulangi proses siklus round ini sampai tidak ada pemain di server.

Sekarang para pemain dapat muncul di peta dengan tim mereka sendiri dan bermain putaran penuh, bagian berikutnya mengajari Anda tentang skrip di balik perilaku setiap blaster.