Bir tur sırasında, senaryoların zamanı izlemesi ve farklı senaryolar arasında sinyaller göndermesi gerekecektir.Süre, bir zaman senaryosu kullanılarak yönetilecek ve olaylar, Roblox kodlamasındaki bir konsept, bir eşleşmesonu gibi değişiklikleri işaret edecek.
Etkinliklerle sinyaller gönderin
Artık arenada oyuncular var, olaylar maçın başlangıcını işaretlemek ve zamanlayıcının kodu başlamak için kullanılabilir.Daha sonra, bir etkinlik eşleşmesonunu işaretlemek ve oyuncuları lobiye geri dönme zamanı olduğunu bildirmek için de kullanılabilir.
Bu olaylar önceden oluşturulmadı, bu nedenle bağlanabilir olaylar olarak adlandırılan özel olay nesnelerinin oluşturulması gerekecek.Bağlanabilir olaylar genellikle oyuncu tarafından ateşlenen eylemler için kullanılır ve Touched veya Changed gibi olaylara benzer.
Birden fazla kript sayfası aynı bağlanabilir olayları dinleyebilir.Bu, kodunuzu düzenli tutar ve daha sonra maçın başına veya sonuna ekstra kod eklemek daha kolay hale getirir, eğer gerekirse.
Bağlanabilir etkinlikler oluşturma
eşleşmebaşlangıcı ve sonu için bağlanabilir olay nesneleri oluşturarak başlayın.Bağlanabilir olaylar istemciyle etkileşmediğinden, bunlar Sunucu Depolama'ya depolanabilir.
ServerStorage'da, Etkinlikler adlı yeni bir klasör oluşturun. Bu klasörde, MaçBaşlangıcı ve MaçSonu adlı iki BağlanabilirEtkinlik oluşturun.
Etkinlikleri kullan
Şu anda, oyuncular arenaya girdiğinde, aralık süresi zamanlayıcıyı başlatmak yerine yeniden başlatılır.Ana oyun döngüsünün durdurulması ve kodSonraki Bölümüne geçmeden önce MaçBitme etkinliğinin ateşlenmesi gerekiyor.
Etkinliklerin iki yerleşik işlevi vardır: Connect() ve Wait().Daha önce olduğu gibi Connect() kullanmak yerine, MatchEnd'de Wait() duraklatmak için oyun yöneticisi kodunu durdurmak için MatchEnd'e çağrın.Bu durumda, bekleme işlevi oyun yöneticisinin maçın sona erdiğine dair bir sinyal alana kadar kodu duraklatır.
In Oyun Yöneticisi , Events klasörü ve MatchEnd etkinlik için değişkenler oluşturun.
-- Modül Kodlarılocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Etkinliklerlocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")Senaryo, devam etmeden önce maç bitiş etkinliğinin ateşlenmesini bekler. döngüsünde , sonunda , şunu yazın: matchEnd.Event:Wait()
while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Yer tutucu, oyunun uzunluğunu bekler.matchEnd.Event:Wait()endTest oyunu.Oyuncular bir kez arenada olduğundan emin olun, aralık döngüsü devam etmiyor .Senaryo şimdi matchEnd sinyali ateşlemek için bekliyor.
Sorun giderme ipuçları
Bu noktada, kod beklenen şekilde çalışmıyor, aşağıdakilerden birini deneyin.
- matchEnd.Event:Wait() 'de nokta veya virgül operatörlerinin kullanımını iki kez kontrol edin.
- MatchEnd'in bir BindableEvent olduğundan ve başka bir yaz, örneğin RemoteEvent, olmadığından emin olun.
Bir zamanlayıcı kullan
Maçın sona ermesine neden olacak koşullardan biri, senaryo aracılığıyla ele alınacak bir zaman aşırısıdır. One of the conditions that will cause the end of the match is a timer running out, which will be handled through the script.
Zamanlayıcıyı kurun
oyunbir zamanlayıcı eklemek için, aşağıdaki adımlarda önceden yapılmış modül senaryosunu kullanın.Bir zamanlayıcıyı başlatmak ve bitirmek için fonksiyonları içerir ve ayrıca kalan süre miktarını geri verir.
ServerStorage > ModuleScripts'ta, Timer adlı yeni bir modül senaryosu oluşturun.
Kodu aşağıdaki kodla değiştirin.
local Timer = {}Timer.__index = Timerfunction Timer.new()local self = setmetatable({}, Timer)self._finishedEvent = Instance.new("BindableEvent")self.finished = self._finishedEvent.Eventself._running = falseself._startTime = nilself._duration = nilreturn selfendfunction Timer:start(duration)if not self._running thentask.spawn(function()self._running = trueself._duration = durationself._startTime = tick()while self._running and tick() - self._startTime < duration dotask.wait()endlocal completed = self._runningself._running = falseself._startTime = nilself._duration = nilself._finishedEvent:Fire(completed)end)elsewarn("Warning: timer could not start again as it is already running.")endendfunction Timer:getTimeLeft()if self._running thenlocal now = tick()local timeLeft = self._startTime + self._duration - nowif timeLeft < 0 thentimeLeft = 0endreturn timeLeftelsewarn("Warning: could not get remaining time, timer is not running.")endendfunction Timer:isRunning()return self._runningendfunction Timer:stop()self._running = falseendreturn TimerMatchManager'da, OyunAyarları ve Zamanlayıcı modüllerini gerektirin.
local MatchManager = {}-- Hizmetlerlocal ServerStorage = game:GetService("ServerStorage")-- 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"))Değişkenlerin altında, myTimer eşit olan bir değişken adlandırarak yeni bir zamanlayıcı nesnesi oluşturun timer.new() .Bu nesne, zamanlayıcıyı başlatan ve durduran işlevleri çağırmak için kullanılacaktır.
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Maç süresini izlemek için kullanılacak yeni bir zamanlayıcı nesnesi oluşturur.local myTimer = timer.new()
Başlat ve durdur
Artık bir zamanlayıcı oluşturuldu, bir eşleşmesırasında dahil edilen işlevler start() ve stop() kullanın.Aşağıda her bir işlevin açıklaması ve kabul ettiği parametre bulunmaktadır.
- start(time) - Saati başlatır, parametre olarak saniyelerle süre.
- finished:Connect(functionName) - Zamanlayıcı bitince, bir parametre olarak geçen işlev çalışır.
In Maç Yöneticisi , zamanlayıcı bitince çalışacak yeni bir işlev oluşturun timeUp() . Bir test yazdırma ifadesi dahil edin.
local myTimer = timer.new()-- Yerel Fonksiyonlarlocal function timeUp()print("Time is up!")end-- Modül İşlevlerifunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerAşağıda timeUp() , bir yazıcı ifadesi ile adlandırılan bir işlev ekleyin startTimer() . Daha sonra oyundaki zamanlayıcıyı gösterirsiniz.
-- Yerel Fonksiyonlarlocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endZamanlayıcıyı başlatmak ve durdurmak için, startTimer() :
- Çağrı myTimer.start() . Geçiş gameSettings.matchDuration .
- Çağrı myTimer.finished:Connect() . Geçiş timeUp() .
-- Yerel Fonksiyonlarlocal function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)end
Süreç başlatın
Zamanlayıcı, Maç Başlangıç etkinliğini kullanarak bir maçın başlangıcında tetiklenebilir.
Maç Yöneticisinde, modül değişkenlerinin altında, Etkinlik klasörünü, Maç Başlangıcı ve Maç Sonu (gelecekte bir dersde kullanılan) saklamak için değişkenler oluşturun.
-- 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")local matchEnd = events:WaitForChild("MatchEnd")--Zamanlayıcı oluştururlocal myTimer = timer.new()Üstünde return MatchManager , maç başlangıç etkinliğini startTimer() 'ye bağla.
-- Modül İşlevlerifunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerMaç başlangıç etkinliğini ateşlemek için, prepareGame() , matchStart:Fire() yazın.
-- Modül İşlevlerifunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endoyuntest edin. Çıktı penceresinde, zamanlayıcının başlangıç ve durdurma işlevleri için yazıcı ifadelerini görebileceğinizi onaylayın.
Tamamlanmış senaryolar
Aşağıda, çalışmanızı kontrol etmek için bitmiş senaryolar bulunmaktadır.
MaçYöneticisi skripti
local MatchManager = {}
-- Hizmetler
local ServerStorage = game:GetService("ServerStorage")
-- 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")
-- Maç süresini izlemek için kullanılacak yeni bir zamanlayıcı nesnesi oluşturur.
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)
end
-- Modül İşlevleri
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
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"))-- Etkinliklerlocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Yer tutucu, oyunun uzunluğunu bekler.matchEnd.Event:Wait()end