Ş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.
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.
Başlangıç GUI klasöründe, yeni bir ScreenGUI oluşturun. Sonra ScreenGUI'de, yeni bir TextLabel adında StatusText ekleyin.
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.
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.
StarterGui > ScreenGUI > Status, StatusDisplay adında yeni bir yerel skript ekleyin. GUI'yi etkileyen skripterler genellikle bu GUI öğesine bağlıdır.
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.
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.Parentlocal function updateText()textLabel.Text = status.ValueendDeğiştirilen olaya işlevi bağla.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)Oyuncular oyunu başlatırken en yeni durumu görür, oyunun sonunda updateText() ı çalıştırın.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)updateText()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.
In ServerStorage > ModülScriptler , DisplayManager adında yeni bir modül scripti oluşturun. Rename the module table to match the script name.
takip edileniçin yerel değişkenler ekleyin: Replicated Storage, DisplayValues klasörü, Status.
local DisplayManager = {}-- Hizmetlerlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Oyuncu GUI'sini güncellemenin kullanılan Değerlerini gösterlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")-- Yerel Fonksiyonlar-- Modülasyon Fonksiyonlarıreturn DisplayManagerDurum 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 = newStatusend
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.
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.
-- 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"))İş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.
-- 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()endMolaya 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 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 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.
ReplicatedStorage > DisplayValues'de, PlayerLeft ve TimeLeft adında iki IntValue oluşturun.
DisplayManager'da, oyuncuların sol ve sağ değerlerini depolamak için ortaya çıkan değişkenleri ekleyin.
local DisplayManager = {}-- Hizmetlerlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Oyuncu GUI'sini güncellemenin kullanılan Değerlerini gösterlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")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 Fonksiyonlarlocal function updateRoundStatus()status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.ValueendFor both IntValue variables, connect updateRoundStatus() to the Changed event.
-- Modülasyon Fonksiyonlarıfunction DisplayManager.updateStatus(newStatus)status.Value = newStatusendplayersLeft.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.
PlayerManager'da ReplicatedStorage hizmeti, DisplayValues klasörü ve PlayersLeft IntValue için yerel ortam değişkenleri 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")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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(availableSpawnPoints, 1)preparePlayer(whichPlayer, spawnLocation)endplayersLeft.Value = #activePlayersend
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.
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 = {}-- 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() 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ü sunartask.wait()endEklenince 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ü sunartask.wait()endendOyunu 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
-- 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
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()