Saat ini, banyak informasi permainan berada di Jendela Keluar, yang tidak terlihat bagi pemain. Jadi pemain dapat diinformasikan tentang apa yang terjadi dalam game, Anda akan menciptakan antarmuka pengguna grafis (GUI) dan mengeksekusannya.
Menampilkan Informasi dengan GUI
Untuk game ini, label teks akan menunjukkan status game saat ini serta jumlah pemain yang tersisa dan waktu.
Mengatur GUI
Pertama, buat objek Screen GUI untuk menahan elemen teks yang berbeda. Saat pemain menggerakkan kamera, screen GUI tetap berada di tempat yang sama di layar mereka.
Untuk memastikan semua pemain melihat tampilan yang sama, letakkan GUI di StarterGui folder. Pada saat pemain memulai permainan, folder ini dicadangkan ke semua pemain.
Di dalam StarterGui folder, buat ScreenGUI baru. Kemudian di ScreenGUI, tambahkan TextLabel baru bernama 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 menggunakan poin taut di sudut-sudut.
Scripting GUI
Untuk mencerminkan perubahan dalam game, skrip akan perlu menyimpan elemen GUI. kejadian, status permainan, apakah itu istirahat atau putaran aktif, akan disimpan dalam StringValue dan diperbarui menggunakan lokasi skrip lokal.
Mengatur skrip
Skrip StatusDisplay akan digunakan untuk menyiarkan GUI pemain setiap kali status permainan berubah.
Di ReplicatedStorage , buat folder bernama DisplayValues. Di folder tersebut, 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 dikaitkan dengan elemen GUI tersebut.
Buka StatusDisplay dan definisikan variabel berikut untuk ikuti:
Layanan ReplicatedStorage
Menggabungkan nilai tampilan
Nilai Status
TextLabel - 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 berubah sehingga setiap kali Status string diubah oleh script lain, label teks akan diperbarui.
Kode fungsi baru bernama updateText() . Dalam fungsi itu, tetapkan prop性 Teks dari textLabel ke status.Value .
local textLabel = script.Parentlocal function updateText()textLabel.Text = status.ValueendHubungkan fungsi ke acara yang berubah.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)Jadi pemain melihat status terbaru saat memulai game, lari updateText() di akhir script.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)updateText()Lari game dan konfirmasi bahwa Anda melihat nilai sementara di tampilan.
Membuat Manajer Display
Selama game, label teks akan memerlukan untuk mendapatkan informasi dari GameManager, MatchManager, dan mungkin script lainnya. Jadi, ini berbagai script dapat mengaktifkan label teks ketika diperlukan, membuat modul script bernama DisplayManager.
Mengatur skrip
Karena DisplayManager perlu berkomunikasi dengan script lain, itu akan menjadi modul script.
Di ServerStorage > ModulScripts , buat script modul baru bernama DisplayManager. Rename tabel modul untuk mencocokkan nama script.
Tambahkan variabel lokal untuk mengikuti: Replicated Storage, Directory, Status.
local DisplayManager = {}-- Layananlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- MenampilkanNilai yang digunakan untuk menyetel ulang GUI Pemainlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")-- Fungsi Lokal-- Fungsi Modulreturn DisplayManagerBuat fungsi modul baru bernama updateStatus() yang menyetel ulang string dalam nilai Status. Script lain akan dapat memanggil fungsi ini.
-- Fungsi Lokal-- Fungsi Modulfunction DisplayManager.updateStatus(newStatus)status.Value = newStatusend
Memperbarui Status Teks
Dengan Manajer layar diatur, itu dapat digunakan dalam skrip lain untuk menyelesaikan label teks GUI. Sebagai pesan pertama di GUI, tunjukkan awal dan akhir istirahat melalui script GameManager.
Dalam 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 garis pertama setelah while true do statement, call displayManager > updateStatus() dan pass dalam pesan tentang menunggu pemain.
-- Acaralocal 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 repeat loop untuk intermission, call updateStatus() dan pass in a string宣布比赛开始. Karena Anda akan menguji dengan GUI, hapus dua pernyataan print untuk menyebutkan awal dan akhir intermission.
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" .
Tips Troubleshoot
Pada titik ini, jika label teks tidak menampilkan pesan pertama, atau masih menampilkan "Label", coba salah satu dari berikut.
- Pastikan dalam skrip StatusDisplay lokal bahwa updateText() dianggap di bagian bawah skrip. Ini memastikan bahwa pemain mendapatkan pesan paling up to date.
- Periksa bahwa Status StringValue ada di ReplicatedStorage. Karena keunikan hubungan antara klien dan server, jika itu di ServerStorage, lokasi script lokal tidak akan dapat menemukannya.
Menampilkan Status Pertandingan
Selama mencocokkan, GUI akan menunjukkan dua nomor: jumlah pemain tersisa dan waktu. Sebagai nomor ini berubah, label teks akan berubah juga.
MengaturNilai dan Fungsi
IntValues akan digunakan untuk menyimpan jumlah pemain dan waktu tersisa.
Dalam ReplicatedStorage > DisplayColors, buat dua IntColors bernama PlayersLeft dan TimeLeft.
Di DisplayManager, tambahkan variabel untuk menyimpan nilai pemain yang tersisa dan waktu tersisa.
local DisplayManager = {}-- Layananlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- MenampilkanNilai yang digunakan untuk menyetel ulang 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, tetapkan nilai status untuk menunjukkan 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() dengan acara yang diubah.
-- Fungsi Modulfunction DisplayManager.updateStatus(newStatus)status.Value = newStatusendplayersLeft.Changed:Connect(updateRoundStatus)timeLeft.Changed:Connect(updateRoundStatus)return DisplayManager
Menampilkan Pemain
Selanjutnya, tambahkan kode untuk menampilkan jumlah pemain di awal game. Pelajaran nanti akan memperbarui nilai PlayersLeft saat pemain dihapus dari game.
Di PlayerManager, tambahkan variabel lokal untuk layanan ReplicatedStorage, DirectoryValue dan PlayersLeft IntValue.
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")Tunjukkan jumlah pemain awal dengan menetapkan nilai playersLeft ke ukuran matriks阵 pemain aktif.
Kemudian, dalam sendPlayersToMatch() , di bawah for loop, 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
Menampilkan Timer
Ingat bahwa naskah modul digunakan untuk mengumpulkan kode serupa. Karena timer diperbarui menggunakan fungsi dari Timer script, update nilai TimeLeft menggunakan fungsi dari naskah Timer. Manajer tampilan akan mendengarkan perubahan pada TimeLeft, dan menyelesaikan untuk menyinkronisasi nilai baru.
Di MatchManager, buat variabel untuk menyimpan ReplicatedStorage layanan, DirectoryValue folder dan TimeLeft value.
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"))-- Acaralocal 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 acara Finished timer, salinan dan pasa seluruh, ditampilkan saat berikutnya, kode berlari dalam satu loop untuk menyelesaikan nilai Finished saat nilai timer masih aktif.
while myTimer:isRunning() do-- Menambahkan +1 memastikan tampilan timer berakhir pada 1 bukan 0.timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))-- Dengan tidak menetapkan waktu tunggu, itu menawarkan lebih banyak looping yang akurattask.wait()endSetelah 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 pada 1 bukan 0.timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))-- Dengan tidak menetapkan waktu tunggu, itu menawarkan lebih banyak looping yang akurattask.wait()endendJalankan game dengan pemain minimum. Periksa bahwa teks status ditampilkan:
- Jumlah pemain yang benar. Ingat, angka ini tidak akan berubah sampai kode tambahan ditambahkan dalam sebuah kursus masa depan.
- Waktu berkurang setiap detik sampai berhenti pada 1.
Skrip yang Diselesaikan
Di bawah ini adalah script yang selesai untuk memeriksa kembali pekerjaan Anda.
Skrip GameManager
-- 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"))-- Acaralocal 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 Tampilan
local DisplayManager = {}
-- Layanan
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- MenampilkanNilai yang digunakan untuk menyetel ulang 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 MatchManager
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"))
-- Acara
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 pada 1 bukan 0.
timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))
-- Dengan tidak menetapkan waktu tunggu, itu menawarkan lebih banyak looping yang akurat
task.wait()
end
end
-- Fungsi Modul
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
Skrip StatusDisplay
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()