Membuat GUI

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

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.

Selama Ijazah
Selama Pertandingan

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.

  1. Di dalam StarterGui folder, buat ScreenGUI baru. Kemudian di ScreenGUI, tambahkan TextLabel baru bernama StatusText.

  2. 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.

  1. 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!".

  2. Di StarterGui > ScreenGUI > Status, tambahkan skrip lokal baru bernama StatusDisplay. Skrip yang mempengaruhi GUI sering dikaitkan dengan elemen GUI tersebut.

  3. 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.

  1. Kode fungsi baru bernama updateText() . Dalam fungsi itu, tetapkan prop性 Teks dari textLabel ke status.Value .


    local textLabel = script.Parent
    local function updateText()
    textLabel.Text = status.Value
    end
  2. Hubungkan fungsi ke acara yang berubah.


    local function updateText()
    textLabel.Text = status.Value
    end
    status.Changed:Connect(updateText)
  3. Jadi pemain melihat status terbaru saat memulai game, lari updateText() di akhir script.


    local function updateText()
    textLabel.Text = status.Value
    end
    status.Changed:Connect(updateText)
    updateText()
  4. 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.

  1. Di ServerStorage > ModulScripts , buat script modul baru bernama DisplayManager. Rename tabel modul untuk mencocokkan nama script.

  2. Tambahkan variabel lokal untuk mengikuti: Replicated Storage, Directory, Status.


    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")
    -- Fungsi Lokal
    -- Fungsi Modul
    return DisplayManager
  3. Buat fungsi modul baru bernama updateStatus() yang menyetel ulang string dalam nilai Status. Script lain akan dapat memanggil fungsi ini.


    -- Fungsi Lokal
    -- Fungsi Modul
    function DisplayManager.updateStatus(newStatus)
    status.Value = newStatus
    end

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.

  1. Dalam ServerScriptService > GameManager, buat variabel bernama displayManager dan memerlukan modul DisplayManager di ServerStorage.


    -- Layanan
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Skrip Modul
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local roundManager = require(moduleScripts:WaitForChild("RoundManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
  2. Sebagai garis pertama setelah while true do statement, call displayManager > updateStatus() dan pass dalam pesan tentang menunggu pemain.


    -- Acara
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
    while true do
    displayManager.updateStatus("Waiting for Players")
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    matchEnd.Event:Wait()
    end
  3. Setelah 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 do
    displayManager.updateStatus("Waiting for Players")
    repeat
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    displayManager.updateStatus("Get ready!")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    matchEnd.Event:Wait()
    end
  4. Uji 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.

  1. Dalam ReplicatedStorage > DisplayColors, buat dua IntColors bernama PlayersLeft dan TimeLeft.

  2. Di DisplayManager, tambahkan variabel untuk menyimpan nilai pemain yang tersisa dan waktu tersisa.


    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")
  3. 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 Lokal
    local function updateRoundStatus()
    status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.Value
    end
  4. Untuk kedua variabel IntValue, hubungkan updateRoundStatus() dengan acara yang diubah.


    -- Fungsi Modul
    function DisplayManager.updateStatus(newStatus)
    status.Value = newStatus
    end
    playersLeft.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.

  1. Di PlayerManager, tambahkan variabel lokal untuk layanan ReplicatedStorage, DirectoryValue dan PlayersLeft IntValue.


    local PlayerManager = {}
    -- Layanan
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    -- Variabel Peta
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Nilai
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local playersLeft = displayValues:WaitForChild("PlayersLeft")
  2. 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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(availableSpawnPoints, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
    playersLeft.Value = #activePlayers
    end

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.

  1. Di MatchManager, buat variabel untuk menyimpan ReplicatedStorage layanan, DirectoryValue folder dan TimeLeft value.


    local MatchManager = {}
    -- Layanan
    local ServerStorage = game:GetService("ServerStorage")
    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")
    -- Nilai
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local timeLeft = displayValues:WaitForChild("TimeLeft")
    local myTimer = timer.new()
  2. 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 akurat
    task.wait()
    end

    Setelah 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 akurat
    task.wait()
    end
    end
  3. Jalankan 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


-- Layanan
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Skrip Modul
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
-- Acara
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
while true do
displayManager.updateStatus("Waiting for Players")
repeat
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
displayManager.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()