Saat ini, banyak informasi permainan saat ini ada di jendela Keluaran, tidak terlihat oleh pemain.Jadi pemain dapat diberi tahu tentang apa yang terjadi dalam game, Anda akan membuat antarmuka pengguna grafis (GUI) dan mengkodifikasinya.
Tampilkan informasi dengan GUI
Untuk permainan ini, label teks akan menampilkan status permainan saat ini serta jumlah dan waktu pemain yang tersisa.


Menyiapkan GUI
Pertama, buat objek GUI Layar untuk menampung elemen teks yang berbeda.Ketika pemain memindahkan kamera, GUI layar tetap di tempat yang sama di layar mereka.
Untuk memastikan semua pemain melihat tampilan yang sama, letakkan GUI di folder StarterGUI . Saat permainan dimulai, folder ini disalin ke semua pemain.
Di folder StarterGUI, buat ScreenGUI baru. Kemudian di ScreenGUI, tambahkan Label Teks baru dengan nama StatusText.
Untuk memindahkan label, di Explorer, pilih StatusText.Kemudian, dalam pandangan permainan, seret label di mana Anda ingin itu.Angka Anda mungkin berbeda dari video.Label juga dapat diubah ukurannya menggunakan titik anker di sudut.
Skrip GUI
Untuk mencerminkan perubahan dalam game, skrip perlu memperbarui elemen GUI.kejadian, status permainan, apakah itu istirahat atau ronde aktif, akan disimpan dalam StringValue dan diperbarui menggunakan skrip lokal.
Menyiapkan skrip
Skrip StatusDisplay akan digunakan untuk memperbarui GUI pemain setiap kali status permainan berubah.
Di ReplicatedStorage , buat folder bernama DisplayValues.Di folder itu, tambahkan StringValue bernama Status.Untuk menguji nilai nanti, berikan nilai sementara, seperti "Selamat Datang di Pertempuran!".
Di StarterGUI > ScreenGUI > Status, tambahkan skrip lokal baru bernama StatusDisplay. Skrip yang mempengaruhi GUI sering diberikan ke elemen GUI itu.
Buka StatusDisplay dan definisikan variabel berikut untuk diikuti:
Layanan Penyimpanan Replikasi
Folder DisplayValues
Status StringValue
Label Teks - gunakan script.Parent .
local ReplicatedStorage = game:GetService("ReplicatedStorage")local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local textLabel = script.Parent
Mengubah label teks
Untuk mengubah teks di label, gunakan acara yang diubah sehingga setiap kali string Status diubah oleh skrip lain, label teks akan diperbarui.
Kode fungsi baru bernama updateText() . Dalam fungsi itu, atur properti Teks dari textLabel ke status.Value .
local textLabel = script.Parentlocal function updateText()textLabel.Text = status.ValueendHubungkan fungsi ke acara yang diubah.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)Jadi pemain melihat status terbaru saat memulai game, jalankan updateText() di akhir skrip.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)updateText()Jalankan permainan dan konfirmasikan bahwa Anda melihat nilai sementara di layar.
Buat manajer tampilan
Selama game, label teks perlu mendapatkan informasi dari GameManager, MatchManager, dan mungkin skrip lainnya.Jadi skrip yang berbeda ini dapat memperbarui label teks saat diperlukan, membuat skrip modul bernama DisplayManager.
Menyiapkan skrip
Karena DisplayManager perlu berkomunikasi dengan skrip lain, itu akan menjadi skrip modul.
Di ServerStorage > Skrip Modul , buat skrip modul baru bernama DisplayManager.Ganti nama tabel modul untuk cocok dengan nama skrip.
Tambahkan variabel lokal untuk hal mengikuti: Replicated Storage, folder DisplayValues, Status.
local DisplayManager = {}-- Layananlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Tampilkan Nilai yang digunakan untuk memperbarui GUI Pemainlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")-- Fungsi Lokal-- Fungsi Modulreturn DisplayManagerBuat fungsi modul baru bernama updateStatus() yang memperbarui string di nilai Status. Skrip lain akan dapat memanggil fungsi ini.
-- Fungsi Lokal-- Fungsi Modulfunction DisplayManager.updateStatus(newStatus)status.Value = newStatusend
Perbarui status tekstu
Dengan Manajer Tampilan diatur, itu dapat digunakan di skrip lain untuk memperbarui label teks GUI.Sebagai pesan pertama di GUI, tampilkan awal dan akhir istirahat melalui skrip GameManager.
Di ServerScriptService > GameManager, buat variabel bernama displayManager dan memerlukan modul DisplayManager di ServerStorage.
-- Layananlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local roundManager = require(moduleScripts:WaitForChild("RoundManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))Sebagai baris pertama setelah pernyataan while true do , panggil displayManager > updateStatus() dan berikan pesan tentang menunggu pemain.
-- Peristiwalocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dodisplayManager.updateStatus("Waiting for Players")repeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayerstask.wait(gameSettings.transitionTime)matchManager.prepareGame()matchEnd.Event:Wait()endSetelah akhir dari loop berulang untuk jeda, panggil updateStatus() dan berikan string yang mengumumkan pertandingan dimulai.Karena Anda akan menguji dengan GUI, hapus dua pernyataan cetak untuk mencatat awal dan akhir jeda.
while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()matchEnd.Event:Wait()endUji permainan dengan dan tanpa pemain minimum Anda. Pesan harus membaca mengikuti:
- Tanpa pemain minimum: "Waiting for Players" .
- Dengan pemain minimum: "Get ready" .
Tip pemecahan masalah
Pada titik ini, jika label teks tidak menampilkan pesan pertama, atau masih menampilkan "Label", coba salah satu dari berikut ini.
- Pastikan dalam skrip lokal StatusDisplay bahwa updateText() dipanggil di bagian bawah skrip.Ini memastikan bahwa pemain mendapatkan pesan terbaru.
- Periksa apakah StringValue Status ada di ReplicatedStorage.Karena sifat unik dari hubungan klien-server, jika berada di ServerStorage, skrip lokal tidak akan dapat menemukannya.
Tampilkan status pertandingan
Selama mencocokkan, GUI akan menampilkan dua angka: jumlah pemain yang tersisa dan waktu. Saat angka-angka ini berubah, label teks juga akan berubah.
Tetapkan nilai dan fungsi
IntValues akan digunakan untuk menyimpan hitungan pemain dan waktu yang tersisa.
Di ReplicatedStorage > DisplayValues, buat dua IntValues bernama PlayersLeft dan TimeLeft.
Di DisplayManager, tambahkan variabel untuk menyimpan nilai pemain yang tersisa dan waktu yang tersisa.
local DisplayManager = {}-- Layananlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Tampilkan Nilai yang digunakan untuk memperbarui GUI Pemainlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")Buat fungsi lokal bernama updateMatchStatus() . Kemudian, atur nilai status untuk menampilkan jumlah pemain yang tersisa dan waktu yang tersisa.
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")-- Fungsi Lokallocal function updateRoundStatus()status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.ValueendUntuk kedua variabel IntValue, hubungkan updateRoundStatus() ke acara yang diubah.
-- Fungsi Modulfunction DisplayManager.updateStatus(newStatus)status.Value = newStatusendplayersLeft.Changed:Connect(updateRoundStatus)timeLeft.Changed:Connect(updateRoundStatus)return DisplayManager
Tampilkan pemain
Selanjutnya, tambahkan kode untuk menampilkan jumlah pemain di awal game.Pelajaran selanjutnya akan memperbarui nilai PlayersLeft saat pemain dieliminasi dari game.
Di PlayerManager, tambahkan variabel lokal untuk layanan ReplicatedStorage, folder DisplayValues dan IntValue IntPlayer.
local PlayerManager = {}-- Layananlocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Variabel Petalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Nilailocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local playersLeft = displayValues:WaitForChild("PlayersLeft")Tampilkan hitungan pemain awal dengan menetapkan nilai playersLeft ke ukuran array pemain aktif.
Kemudian, di sendPlayersToMatch() , di bawah loop for, ketik: playersLeft.Value = #activePlayers
function PlayerManager.sendPlayersToMatch()local availableSpawnPoints = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(availableSpawnPoints, 1)preparePlayer(whichPlayer, spawnLocation)endplayersLeft.Value = #activePlayersend
Tampilkan timer
Ingat bahwa skrip modul digunakan untuk menyentralisasi kode serupa.Karena waktu tercatat di MatchManager, perbarui nilai TimeLeft menggunakan fungsi dari skrip Timer.Manajer tampilan akan mendengarkan perubahan pada TimeLeft, dan diperbarui untuk sesuai dengan nilai baru.
Di MatchManager, buat variabel untuk menyimpan layanan ReplicatedStorage , folder DisplayValues dan nilai TimeLeft.
local MatchManager = {}-- Layananlocal ServerStorage = game:GetService("ServerStorage")local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Peristiwalocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")-- Nilailocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local timeLeft = displayValues:WaitForChild("TimeLeft")local myTimer = timer.new()Temukan fungsi startTimer() . Setelah peristiwa Finished timer, salin dan tempel seluruhnya, disorot saat loop di bawah ini.Kode menjalankan loop untuk memperbarui nilai timeLeft sampai timer masih aktif.
while myTimer:isRunning() do-- Menambahkan +1 memastikan tampilan timer berakhir di 1 bukan 0.timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1-- Dengan tidak menetapkan waktu untuk menunggu, ia menawarkan looping yang lebih akurattask.wait()endSaat ditambahkan, kode harus terlihat seperti sampel di bawah ini.
local function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)while myTimer:isRunning() do-- Menambahkan +1 memastikan tampilan timer berakhir di 1 bukan 0.timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1-- Dengan tidak menetapkan waktu untuk menunggu, ia menawarkan looping yang lebih akurattask.wait()endendJalankan permainan dengan pemain minimum. Periksa apakah teks status ditampilkan:
- Jumlah pemain awal yang benar. Ingat, angka ini tidak akan berubah sampai kode tambahan ditambahkan dalam pelajaran masa depan.
- Waktu berkurang setiap detik sampai berhenti di 1.
Skrip selesai
Di bawah ini adalah skrip yang selesai untuk memeriksa ulang pekerjaan Anda.
Skrip Manajer Game
-- Layananlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))-- Peristiwalocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()matchEnd.Event:Wait()end
Skrip Manajer Layar
local DisplayManager = {}
-- Layanan
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Tampilkan Nilai yang digunakan untuk memperbarui GUI Pemain
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local status = displayValues:WaitForChild("Status")
local playersLeft = displayValues:WaitForChild("PlayersLeft")
local timeLeft = displayValues:WaitForChild("TimeLeft")
-- Fungsi Lokal
local function updateRoundStatus()
status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.Value
end
-- Fungsi Modul
function DisplayManager.updateStatus(newStatus)
status.Value = newStatus
end
playersLeft.Changed:Connect(updateRoundStatus)
timeLeft.Changed:Connect(updateRoundStatus)
return DisplayManager
Skrip Manajer Pertandingan
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Skrip Modul
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Peristiwa
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Nilai
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local timeLeft = displayValues:WaitForChild("TimeLeft")
local myTimer = timer.new()
-- Fungsi Lokal
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
while myTimer:isRunning() do
-- Menambahkan +1 memastikan tampilan timer berakhir di 1 bukan 0.
timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1
-- Dengan tidak menetapkan waktu untuk menunggu, ia menawarkan looping yang lebih akurat
task.wait()
end
end
-- Fungsi Modul
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
Skrip Tampilan Status
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local status = displayValues:WaitForChild("Status")
local textLabel = script.Parent
local function updateText()
textLabel.Text = status.Value
end
status.Changed:Connect(updateText)
updateText()