GUI oluşturun

*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, oyun bilgilerinin çoğu şu anda Çıktı penceresinde, oyuncular için görünmez.Böylece oyuncular oyundaki neler olduğu hakkında bilgilendirilebilir, bir grafik kullanıcı arayüzü (GUI) oluşturur ve kodlar.

Bir GUI ile bilgi görüntüleme

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

Mola Sırasında
>

Bir Maç Sırasında
>

GUI'yi kurun

Öncelikle, farklı metin elemanlarını tutacak bir Ekran GUI nesnesi oluşturun.Oyuncu kamera hareket ettirdiğinde, ekran arayüzü onların ekranındaki aynı yerde kalır.

Tüm oyuncuların aynı görüntüyü gördüğünden emin olmak için, GUI'yi Başlangıç ​​GUI klasörüne yerleştirin. Oyun başlangıçta, bu klasör tüm oyunculara kopyalanır.

  1. Başlangıç ​​GUI klasöründe, yeni bir Ekran GUI oluşturun. Ardından Ekran GUI'de, Durum Text adlı yeni bir TextLabel ekleyin.

  2. Etiketi hareket ettirmek için, Gezginde, DurumMetni seçin.Sonra, oyun görünümünde, istediğiniz etiketi sürükle.Sayılarınız videodan farklı olabilir.Etiket, köşelerdeki sabit noktaları kullanarak da yeniden boyutlandırılabilir.

GUI'yi kodlayın

Oyundaki değişiklikleri yansıtmak için, senaryolar GUI öğelerini güncellemek zorunda kalacak.Örneğin, oyun durumu, aralık mı yoksa aktif bir tur mu, yerel kodlar kullanılarak depolanacak ve yerel kodlar kullanılarak güncellenecektir.

Senaryoyu kurun

Oyun durumu değiştiğinde oyuncunun GUI'sini güncelletmek için DurumGörüntüleme scripti kullanılacaktır.

  1. In Yeniden Yapılan Depolama , DisplayValues adlı bir klasör oluşturun.Bu klasörde, Durum adlı bir StringValue ekleyin.Değeri daha sonra test etmek için, "Savaşa Hoş Geldiniz!" gibi geçici bir değer verin.

  2. Başlangıç ​​GUI > Ekran GUI > Durum'a yeni bir DurumDisplay adlı yerel senaryo ekleyin. GUI'yi etkileyen senaryolar genellikle bu GUI öğesine bağlıdır.

  3. Durum Görüntüsü'nü aç ve takibi için aşağıdaki değişkenleri tanımlayın:

    • ReplicatedStorage hizmeti

    • DisplayValues klasörü

    • Durum StringValue

    • MetinEtiketi - kullan script.Parent .


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

Metin etiketini değiştir

Etiketteki metni değiştirmek için, Değiştirilmiş olayı kullanın, böylece durum dizesi başka bir senaryo tarafından değiştirildiğinde, metin etiketi güncellenecektir.

  1. Yeni bir işlev adlandırın updateText() . Bu işlevde, textLabel 'in Text özelliğini status.Value 'a ayarlayın.


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


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


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

Görüntü yöneticisini oluştur

Bir oyun sırasında, metin etiketinin GameManager, MatchManager ve muhtemelen diğer senaryolardan bilgi alması gerekecektir.Bu nedenle, bu farklı senaryolar gerektiğinde metin etiketini güncelleyebilir, DisplayManager adlı bir modül senaryosu oluşturabilir.

Senaryoyu kurun

Çünkü DisplayManager'ın diğer kodlarla iletişim kurması gerekiyor, bir modül kodu olacak.

  1. In Sunucu Depolama > ModülScriptları , yeni bir modül senaryosu oluştur DisplayManager adında.Modül tablosunu senaryo adına uymak için yeniden adlandırın.

  2. takip edileniçin yerel değişkenler ekleyin: Yeniden Yansıtılan Depolama, Görüntü Değerleri klasörü, Durum.


    local DisplayManager = {}
    -- Hizmetler
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    -- Oyuncu GUI'sini güncellemek için kullanılan değerleri görüntüle
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local status = displayValues:WaitForChild("Status")
    -- Yerel Fonksiyonlar
    -- Modül İşlevleri
    return DisplayManager
  3. Durum değerindeki dizeyi güncelleyen yeni bir modül işlevi oluşturun updateStatus() . Diğer kodlar bu işlevi çağırabilir.


    -- Yerel Fonksiyonlar
    -- Modül İşlevleri
    function DisplayManager.updateStatus(newStatus)
    status.Value = newStatus
    end

Metin durumunu güncelleştir

Görüntü Yöneticisi kurulduktan sonra, GUI metin etiketini güncelletmek için diğer senaryolarda kullanılabilir.UI'deki ilk mesaj olarak, aranın başlangıcını ve sonunu GameManager betiği aracılığıyla gösterin.

  1. In Sunucu Kod Hizmeti > GameManager'da, displayManager adlı bir değişken oluştur ve ServerStorage'da Görüntü Yöneticisi modülünü 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. While true do ifadesinden sonra ilk satır , çağrıyı görüntü yöneticisine yönlendir > updateStatus() ve oyuncuları beklemekle ilgili bir mesaj geçirin.


    -- 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. Mola için tekrar döngüsünün sonundan sonra, updateStatus() 'yi arayın ve maçın başladığını duyuran bir dize geçirin.GUI ile test yapacağınızdan, mola başlangıcını ve sonunu not etmek için iki baskı 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 test edin ve minimum oyuncularınız olmadan olmadan . Mesaj takip edilenokumalıdır:

    • Minimum oyuncu olmadan: "Waiting for Players" .
    • Minimum oyuncu ile: "Get ready" .

Sorun giderme ipuçları

Bu noktada, metin etiketi ilk mesajı göstermiyorsa veya hala "Etiket" gösteriyorsa, aşağıdakilerden birini deneyin.

  • DurumGörüntüleme yerel senaryosunda updateText() adlı kodun senaryonun altında çağrıldığından emin olun.Bu, oyuncunun en güncel mesajı almasını sağlar.
  • Durum Sтроительство値inin ReplicatedStorage'ta olduğundan emin olun.Client-server ilişkilerinin benzersiz doğası nedeniyle, eğer ServerStorage'da ise, yerel bir senaryo onu bulamayacaktır.

Maç durumunu görüntüle

Bir eşleşmesırasında, GUI iki sayı gösterir: kalan oyuncu sayısı ve süre. Bu sayılar değiştikçe, metin etiketi de değişir.

Değerleri ve işlevleri ayarla

Oyuncu sayısı ve kalan süre depolanmak için IntValues kullanılacaktır.

  1. ReplicatedStorage > DisplayValues'ta, PlayersLeft ve TimeLeft adlı iki IntValues oluşturun.

  2. DisplayManager'da, oyuncuların ve kalan süre değerlerinin depolanması için değişkenler ekleyin.


    local DisplayManager = {}
    -- Hizmetler
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    -- Oyuncu GUI'sini güncellemek için kullanılan değerleri görüntüle
    local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
    local status = displayValues:WaitForChild("Status")
    local playersLeft = displayValues:WaitForChild("PlayersLeft")
    local timeLeft = displayValues:WaitForChild("TimeLeft")
  3. Yerel bir işlev oluştur updateMatchStatus() . Sonra, oyuncuların kalan sayısını ve kalan süreyi görüntülemek için durum 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. Her iki IntValue değişkeni için, Değiştirilmiş olaya updateRoundStatus() bağlanın.


    -- Modül İşlevleri
    function DisplayManager.updateStatus(newStatus)
    status.Value = newStatus
    end
    playersLeft.Changed:Connect(updateRoundStatus)
    timeLeft.Changed:Connect(updateRoundStatus)
    return DisplayManager

Oyuncuları görüntüle

Sonra, bir oyunun başında oyuncu sayısını görüntülemek için kodu ekleyin.Daha sonraki dersler, oyuncular oyundan çıkarıldığında OyuncularSol değerini güncelleyecektir.

  1. Oyun Yöneticisinde, ReplicatedStorage hizmeti, DisplayValues klasörü ve PlayersLeft IntValue için yerel değişkenler 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. Başlangıç oyuncu sayısını aktif oyuncu dizesinin boyutuna ayarlayarak playersLeft değerini ayarlayarak gösterin.

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

Modül kodlarının benzer kodları merkezileştirmek için kullanıldığını unutmayın.Zamanlayıcı MatchManager'da izlendiğinden, ZamanSınırı değerini Timer scriptinden işlevler kullanarak güncelleştirin.Görüntü yöneticisi TimeLeft'teki değişiklikleri dinleyecek ve yeni değere uyacak şekilde güncellenecek.

  1. Maç Yöneticisinde, Yeniden Düzenlenmiş Depolama hizmetini, DisplayValues klasörünü ve TimeLeft değerini depolayacak değişkenler oluşturun.


    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() işlevini bulun. Sonra zamanlayıcının Finished etkinliğinden sonra, aşağıdaki döngü boyunca tümünü kopyalayıp yapıştırın.Kod, zamanlayıcı hala aktif olduğu sürece bir döngü yürütür ve timeLeft değerini günceller.


    while myTimer:isRunning() do
    -- +1 eklemek, zamanlayıcının 0 yerine 1'de sona ermesini sağlar.
    timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1
    -- Bekleme süresini ayarlamayarak, daha doğru döngüleme sağlar
    task.wait()
    end

    Eklendiğinde, kod aşağıdaki örneğe benzemelidir.


    local function startTimer()
    print("Timer started")
    myTimer:start(gameSettings.matchDuration)
    myTimer.finished:Connect(timeUp)
    while myTimer:isRunning() do
    -- +1 eklemek, zamanlayıcının 0 yerine 1'de sona ermesini sağlar.
    timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1
    -- Bekleme süresini ayarlamayarak, daha doğru döngüleme sağlar
    task.wait()
    end
    end
  3. Oyunu minimum oyuncu ile çalıştırın. Durum metninin görüntülenmesini kontrol edin:

    • Doğru sayıda başlangıç oyuncusu. Unutmayın, bu sayı gelecekte bir dersin ek kodu eklenene kadar değişmeyecek.
    • Süre, 1'de durana kadar her saniye azalır.

Tamamlanmış senaryolar

Aşağıda, çalışmanızı kontrol etmek için bitmiş senaryolar bulunmaktadır.

GameManager senaryosu


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

Görüntü Yöneticisi kodu


local DisplayManager = {}
-- Hizmetler
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Oyuncu GUI'sini güncellemek için kullanılan değerleri görüntüle
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ül İşlevleri
function DisplayManager.updateStatus(newStatus)
status.Value = newStatus
end
playersLeft.Changed:Connect(updateRoundStatus)
timeLeft.Changed:Connect(updateRoundStatus)
return DisplayManager

MaçYöneticisi skripti


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 eklemek, zamanlayıcının 0 yerine 1'de sona ermesini sağlar.
timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1
-- Bekleme süresini ayarlamayarak, daha doğru döngüleme sağlar
task.wait()
end
end
-- Modül İşlevleri
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager

DurumGösterme senaryosu


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