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


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.
Başlangıç GUI klasöründe, yeni bir Ekran GUI oluşturun. Ardından Ekran GUI'de, Durum Text adlı yeni bir TextLabel ekleyin.
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.
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.
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.
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.
Yeni bir işlev adlandırın updateText() . Bu işlevde, textLabel 'in Text özelliğini status.Value 'a ayarlayın.
local textLabel = script.Parentlocal function updateText()textLabel.Text = status.ValueendFonksiyonu Değiştirilmiş olaya bağla.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)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.Valueendstatus.Changed:Connect(updateText)updateText()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.
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.
takip edileniçin yerel değişkenler ekleyin: Yeniden Yansıtılan Depolama, Görüntü Değerleri klasörü, Durum.
local DisplayManager = {}-- Hizmetlerlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Oyuncu GUI'sini güncellemek için kullanılan değerleri görüntülelocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")-- Yerel Fonksiyonlar-- Modül İşlevlerireturn DisplayManagerDurum 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 İşlevlerifunction DisplayManager.updateStatus(newStatus)status.Value = newStatusend
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.
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.
-- Hizmetlerlocal 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"))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.
-- Etkinliklerlocal 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()endMola 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 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()endOyunu 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.
ReplicatedStorage > DisplayValues'ta, PlayersLeft ve TimeLeft adlı iki IntValues oluşturun.
DisplayManager'da, oyuncuların ve kalan süre değerlerinin depolanması için değişkenler ekleyin.
local DisplayManager = {}-- Hizmetlerlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Oyuncu GUI'sini güncellemek için kullanılan değerleri görüntülelocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")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 Fonksiyonlarlocal function updateRoundStatus()status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.ValueendHer iki IntValue değişkeni için, Değiştirilmiş olaya updateRoundStatus() bağlanın.
-- Modül İşlevlerifunction DisplayManager.updateStatus(newStatus)status.Value = newStatusendplayersLeft.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.
Oyun Yöneticisinde, ReplicatedStorage hizmeti, DisplayValues klasörü ve PlayersLeft IntValue için yerel değişkenler ekleyin.
local PlayerManager = {}-- Hizmetlerlocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Harita Değişkenlerilocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Değerlerlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local playersLeft = displayValues:WaitForChild("PlayersLeft")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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(availableSpawnPoints, 1)preparePlayer(whichPlayer, spawnLocation)endplayersLeft.Value = #activePlayersend
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.
Maç Yöneticisinde, Yeniden Düzenlenmiş Depolama hizmetini, DisplayValues klasörünü ve TimeLeft değerini depolayacak değişkenler oluşturun.
local MatchManager = {}-- Hizmetlerlocal 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"))-- Etkinliklerlocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")-- Değerlerlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local timeLeft = displayValues:WaitForChild("TimeLeft")local myTimer = timer.new()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ğlartask.wait()endEklendiğ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ğlartask.wait()endendOyunu 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
-- Hizmetlerlocal 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"))-- Etkinliklerlocal 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
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()