Bir GUI Oluşturulması

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

Şu anda, oyunun çoğu bilgisi Çıkış Penceresinde bulunmaktadır, oyuncular tarafından görünmez. Bu nedenle, oyunun içindeki olayların ne olduğunu oyunculara bilgilendirebilirsiniz, bir grafik kullanıcı arayüzü (GUI) oluşturacaksınız ve kodlayacaksınız.

Bir GUI ile Bilgi Gösterimi

Bu oyun için bir metin etiketi, mevcut oyun durumunu ve kalan oyuncu sayısını gösterir.

Molada Öğle Yemeği
Bir Maç Sırasında

GUI'yi ayarlama

Önce, farklı metin elemanlarını tutmak için bir Ekran GUI nesnesi oluşturun. Oyuncu kamerayı hareket ettirince, ekran GUI onların ekranındaki aynı yerde kalır.

Tüm oyuncular aynı görüntüyü görmeleri için, GUI'yi Başlangıç ​​GUI klasına yerleştirin. Oyun başlangıcında, bu klasör tüm oyunculara kopyalanır.

  1. Başlangıç ​​GUI klasöründe, yeni bir ScreenGUI oluşturun. Sonra ScreenGUI'de, yeni bir TextLabel adında StatusText ekleyin.

  2. Etiketi hareket ettirmek için, Explorer'da StatusText'i seçin. Sonra, oyun görünümünde etiketi istediğiniz yere sürüklemeyi seçin. Sayılarınız video ile farklı olabilir. Etiket ayrıca köşelerdeki anker noktalarını kullanarak yeniden boyutlandırılabilir.

GUI'yi Kodlama

Değişiklikleri oyunda yansıtmak için, kodlar GUI elemanlarını güncellemeye ihtiyaç duyacaktır. Örneğin, oyun durumu, aktif bir tur veya mola olup olmadığını belirtir, bir StringValue'de saklanacak ve yerel kodlar kullanılarak güncellenecektir.

Script'i ayarlama

StatusDisplay komutu, oyun durumunu değiştirdiğinde oyuncu GUI'sini güncellemeye kullanılacaktır.

  1. In ReplicatedStorage , DisplayValues adında bir klasör oluşturun. Bu klasörde, bir Statüm adında bir StringValue ekleyin. Sonra değeri test etmek için geçici bir değer verin, "Battle'e Hoş Geldiniz" gibi.

  2. StarterGui > ScreenGUI > Status, StatusDisplay adında yeni bir yerel skript ekleyin. GUI'yi etkileyen skripterler genellikle bu GUI öğesine bağlıdır.

  3. StatusDisplay'ı aç ve şu değerleri takip için takip ettanımla:

    • ReplicatedStorage hizmeti

    • DisplayValues klasörü

    • Durum Değeri

    • TextLabel - script.Parent kullanın.


      local ReplicatedStorage = game:GetService("ReplicatedStorage")
      local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
      local status = displayValues:WaitForChild("Status")
      local textLabel = script.Parent

Metni Etiketlerini Değiştirme

Etiketinizdeki metni değiştirmek için bir Değiştirme olayı kullanın, böylece Durum strungunun başka bir script tarafından değiştirildiğinde, metni etiket güncellenecektir.

  1. Kod aşağıdaki gibi yeni bir işlev olan updateText() . Bu işlevde, textLabel 'in Text özelliğini status.Value ile ayarlar.


    local textLabel = script.Parent
    local function updateText()
    textLabel.Text = status.Value
    end
  2. Değiştirilen olaya işlevi bağla.


    local function updateText()
    textLabel.Text = status.Value
    end
    status.Changed:Connect(updateText)
  3. Oyuncular oyunu başlatırken en yeni durumu görür, oyunun sonunda updateText() ı çalıştırın.


    local function updateText()
    textLabel.Text = status.Value
    end
    status.Changed:Connect(updateText)
    updateText()
  4. Oyunu çalıştır ve geçici değerin gösteriminde gördüğünü onayla.

Görüntü Yöneticini Oluşturulması

Bir oyun sırasında, metin etiketi olası olarak Diğer Oyun Yöneticisi, Maç Yöneticisi veya başka kaynaklardan bilgi alabilir. Bu farklı kaynaklar, gerekirse metin etiketini güncellemeyi, DisplayManager adlı bir modül kaynağı oluşturmayı sağlayabilir.

Script'i ayarlama

DisplayManager diğer kodlarla iletişim kurması gerektiğinden, bir modül kodu olacaktır.

  1. In ServerStorage > ModülScriptler , DisplayManager adında yeni bir modül scripti oluşturun. Rename the module table to match the script name.

  2. takip edileniçin yerel değişkenler ekleyin: Replicated Storage, DisplayValues klasörü, Status.


    local DisplayManager = {}
    -- Hizmetler
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    -- Oyuncu GUI'sini güncellemenin kullanılan Değerlerini göster
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local status = displayValues:WaitForChild("Status")
    -- Yerel Fonksiyonlar
    -- Modülasyon Fonksiyonları
    return DisplayManager
  3. Durum değerindeki yüzleştirici adına updateStatus() isimli yeni bir modül fonksiyonu oluşturur. Diğer yazılımlar bu işlevi çağırabilir.


    -- Yerel Fonksiyonlar
    -- Modülasyon Fonksiyonları
    function DisplayManager.updateStatus(newStatus)
    status.Value = newStatus
    end

Metni Durumunu Güncelleme

Ekran Yöneticisi ayarlandıktan sonra, GUI text label'ini güncellelemek için diğer yazılımlarda kullanılabilir. GUI'nin ilk mesajı olarak, GameManager kullanıcı aracılığıyla başlangıç ve sonağını gösterin.

  1. In ServerScriptService > GameManager, bir displayManager ile adlandırılmış değişken oluştur ve ServerStorage'da bir Görüntüleyici modülü gerektir.


    -- Hizmetler
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Modül Kodları
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local roundManager = require(moduleScripts:WaitForChild("RoundManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
  2. İşaretlenen ilk satırın ardındaki ilk satır, displayManager > updateStatus() çağrılır ve oyuncuları bekleyen bir mesajın yanında geçerlidir.


    -- Etkinlikler
    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. Molaya sonlanan tekrar updateStatus() çağrılır ve ardından etkinliğin başlangıcını duyuran bir diziyi geçer. GUI ile test ediyorsanız, ardından ve etkinliğin sona ermesini not etmek için iki print ifadesini silin.


    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. Oyunu ile ve olmadan minimum oyuncularınızla test edin. Mesaj, takip edilengibi okumalıdır:

    • En az oyuncular olmadan: "Waiting for Players" .
    • Minimum oyuncularla: "Get ready" .

Hata ayıklama ipuçları

Bu noktada, metin etiketi ilk mesajı görüntülemezse veya hala "Etiket" görüntülerse, aşağıdaki birinden deneyin.

  • Durum Gösterimi yerel kısmındaki updateText() ile ilgili olup bitenleri gözden geçirin. Bu, oyuncunun en son mesajıyı almasını sağlar.
  • ReplicatedStorage'da StatusStringValue olduğundan emin olun. Client-Server ilişkilerinin benzersiz doğası nedeniyle, eğer ServerStorage'daysa, yerel bir kript onu bulamayacaktır.

Maç Durumunu Gösterme

Bir eşleşmesırasında, GUI iki sayı gösterecek: kalan oyuncu sayısı ve zaman. Bu sayılar değiştirildiğinde, metin etiketi değişecek.

Değerleri ve Fonksiyonları Ayarlama

IntValues, oyuncu sayısını ve kalan süreyi depolamak için kullanılacaktır.

  1. ReplicatedStorage > DisplayValues'de, PlayerLeft ve TimeLeft adında iki IntValue oluşturun.

  2. DisplayManager'da, oyuncuların sol ve sağ değerlerini depolamak için ortaya çıkan değişkenleri ekleyin.


    local DisplayManager = {}
    -- Hizmetler
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    -- Oyuncu GUI'sini güncellemenin kullanılan Değerlerini göster
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local status = displayValues:WaitForChild("Status")
    local playersLeft = displayValues:WaitForChild("PlayersLeft")
    local timeLeft = displayValues:WaitForChild("TimeLeft")
  3. updateMatchStatus() adında bir yerel işlev oluşturun. Sonra, durumun gösterim sayısını ve kalan süreyi göstermek için değerini ayarlayın.


    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local status = displayValues:WaitForChild("Status")
    local playersLeft = displayValues:WaitForChild("PlayersLeft")
    local timeLeft = displayValues:WaitForChild("TimeLeft")
    -- Yerel Fonksiyonlar
    local function updateRoundStatus()
    status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.Value
    end
  4. For both IntValue variables, connect updateRoundStatus() to the Changed event.


    -- Modülasyon Fonksiyonları
    function DisplayManager.updateStatus(newStatus)
    status.Value = newStatus
    end
    playersLeft.Changed:Connect(updateRoundStatus)
    timeLeft.Changed:Connect(updateRoundStatus)
    return DisplayManager

Oyuncuları Gösterme

Ardından, bir oyunun başlangıcında oyuncuların sayısını gösteren kodu ekleyin. Daha son dersler, oyuncuların oyundan ortadan kaldırıldığında PlayerLeft değerini güncelleyecektir.

  1. PlayerManager'da ReplicatedStorage hizmeti, DisplayValues klasörü ve PlayersLeft IntValue için yerel ortam değişkenleri ekleyin.


    local PlayerManager = {}
    -- Hizmetler
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    -- Harita Değişkenleri
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Değerler
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local playersLeft = displayValues:WaitForChild("PlayersLeft")
  2. Aktif oyuncu matrisinin büyüklüğüne değerini playersLeft ile ayarlayarak başlangıç oyuncu sayısını gösterin.

    Sonra, sendPlayersToMatch() altında, for döngüsü altında, yazınız: 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

Zamanlayıcıyı Göstermek

Modül kodlarını merkezlemek için kullanılan modül kodlarıdır. Timer'ın MatchManager'da izlenmesi nedeniyle Timer kodunun işlevlerini kullanarak TimeLeft değerini güncelle. Görüntü yöneticisi değişiklikleri TimeLeft'a dinleyecek ve yeni değerle eşleştirilecek.

  1. In MatchManager, ReplicatedStorage hizmetini, DisplayValues klasörünü ve TimeLeft değerini depolamak için ortaya çıkan çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeş


    local MatchManager = {}
    -- Hizmetler
    local ServerStorage = game:GetService("ServerStorage")
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    -- Modül Kodları
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Etkinlikler
    local events = ServerStorage:WaitForChild("Events")
    local matchStart = events:WaitForChild("MatchStart")
    -- Değerler
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local timeLeft = displayValues:WaitForChild("TimeLeft")
    local myTimer = timer.new()
  2. Find the startTimer() function. After the timer's Finished event, copy and paste the whole, highlighted while loop below. The code runs a loop to update the 1> timeLeft1> value as long as the timer is still active.


    while myTimer:isRunning() do
    -- +1 ekleyerek, zamanlayıcının 0 değil 1'de gösterildiğinden emin olursunuz.
    timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))
    -- Bekleme süresini ayarlamayarak, daha doğru bir döngü sunar
    task.wait()
    end

    Eklenince kod aşağıdaki örneğe benmelidir.


    local function startTimer()
    print("Timer started")
    myTimer:start(gameSettings.matchDuration)
    myTimer.finished:Connect(timeUp)
    while myTimer:isRunning() do
    -- +1 ekleyerek, zamanlayıcının 0 değil 1'de gösterildiğinden emin olursunuz.
    timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))
    -- Bekleme süresini ayarlamayarak, daha doğru bir döngü sunar
    task.wait()
    end
    end
  3. Oyunu minimum oyuncularla çalıştırın. Durum metni görüntülenip görüntülenmediğini kontrol edin:

    • Doğru başlangıç oyuncularının miktarı. Hatırlayın, bu sayı gelecekte bir ders içinde eklenen ekstra kodlar eklenene kadar değişmez.
    • Zaman, 1'e kadar her saniye düşer.

Tamamlanan Scriptler

Aşağıda çalışmanızı iki kat kontrol etmek için tamamlanmış kodlar var.

GameManager Komutu


-- Hizmetler
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Modül Kodları
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
-- Etkinlikler
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

DisplayManager Komutu


local DisplayManager = {}
-- Hizmetler
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Oyuncu GUI'sini güncellemenin kullanılan Değerlerini göster
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local status = displayValues:WaitForChild("Status")
local playersLeft = displayValues:WaitForChild("PlayersLeft")
local timeLeft = displayValues:WaitForChild("TimeLeft")
-- Yerel Fonksiyonlar
local function updateRoundStatus()
status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.Value
end
-- Modülasyon Fonksiyonları
function DisplayManager.updateStatus(newStatus)
status.Value = newStatus
end
playersLeft.Changed:Connect(updateRoundStatus)
timeLeft.Changed:Connect(updateRoundStatus)
return DisplayManager

MatchManager Yazılımı


local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Modül Kodları
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Etkinlikler
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Değerler
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local timeLeft = displayValues:WaitForChild("TimeLeft")
local myTimer = timer.new()
-- Yerel Fonksiyonlar
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
-- +1 ekleyerek, zamanlayıcının 0 değil 1'de gösterildiğinden emin olursunuz.
timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))
-- Bekleme süresini ayarlamayarak, daha doğru bir döngü sunar
task.wait()
end
end
-- Modülasyon Fonksiyonları
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager

StatusDisplay Yazılımı


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()