Harita oluşturulduktan sonra, senaryoları oluşturmaya başlama zamanı geldi.Bu kursun geri kalanı, oyun döngüsünün tüm farklı elemanlarını senaryolaştırmaya ağırlık verecek.
Senaryoları kurun
Savaş kraliyeti, modül kriptleri ve normal kriptlerin bir kombinasyonunu kullanacaktır. Aşağıda kriptler ve işlevleri bulunmaktadır.
OyunYöneticisi | Script. Oyun Ayarlarından değişkenler kullanarak Maç Yöneticisinden işlevleri çalıştırır |
MaçYöneticisi | Modül Kodu. Oyuncuları bir arenaya göndermek veya bir eşleşmezamanı takip etmek gibi işlevleri yürütür. |
OyunAyarları | Modül Kodu. Diğer kodlar tarafından kullanılan yaygın kullanılan değişkenleri saklar. |
OyunAyarları scripti
Maç ve aralık süresi gibi diğer senaryolarda kullanılan değişkenleri depolamak için GameSettings adlı bir modül senaryosu oluşturun.Bu değişkenler daha sonra GameManager scripti tarafından kullanılacaktır.
In Sunucu Depolama , ModülScripts adlı bir klasör oluşturun. Bu klasörde, GameSettings adlı yeni bir modül senaryosu oluşturun.
Oyun Ayarları'nı aç ve modül tablosunun adına uymak için yeniden adlandır.
local GameSettings = {}return GameSettingsModül tablosunda, aşağıdaki kullanımlar için değişkenler ekleyin. Her değer için en iyi tahmininizi yapın, daha sonra test ederken her zaman değiştirebilirsiniz.
- Mola Süresi - Oyuncular bir eşleşmeönce beklerler.
- Maç Süresi - Bir maçın saniye süresi.
- En Az Oyuncu - başlatiçin en küçük oyuncu sayısı.
- Geçiş Süresi - Bir maçın saniyeler öncesi ve sonrasındaki süre. Oyun döngüsünün parçaları arasında geçişi daha az ani hale getirir.
local GameSettings = {}-- Oyun DeğişkenleriGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
MaçYöneticisi skripti
Oyun Yöneticisine bağlanan ikinci senaryo, Maç Yöneticisidir.Bu senaryo, zamanlayıcıyı başlatmak veya maç bitince oyuncuları sıfırlamak gibi görevleri yönetir.
MatchManager içinde prepareGame() adlı bir işlev oyuncuları eşleşmegeçirerek oyunu başlatır.
ServerStorage > ModülScriptları > MatchManager adlı bir modül senaryosu ekleyin. Modül tablosunu yeniden adlandırın.
local MatchManager = {}return MatchManagerMatchManager adlı yeni bir modül işlevi ekleyin prepareGame() . Daha sonra kodu test etmek için bir yazdırma ifadesi dahil edin.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
Oyun döngüsünü kodla
Ana oyun döngüsü, yeni oluşturulan değişkenleri kullanarak GameManager scriptinde kodlanacaktır.Unutma, oyun döngüsünde üç faz var: mola, rekabet ve temizleme ve sıfırlama.
GameManager senaryosu
Bu senaryo normal bir sunucu senaryosudur, bu nedenle modül senaryo klasörü yerine ServerScriptService'e yerleştirin.Gerçek oyun döngüsü bir while true döngüsünde olacaktır.
ServerScriptService'te, GameManager adlı yeni bir senaryo oluşturun.
Modül kodlarının bulunduğu yer olan hizmet "ServerStorage" için bir değişken ekleyin.Ardından, mola sırasında oyuncu sayısını kontrol etmek için gereken "Oyuncular" hizmeti için bir değişken ekleyin.
-- Hizmetlerlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Daha önce oluşturulan modülleri kullanmak için:
- ModülScripts klasörünün konumuna moduleScripts adlı bir değişken ayarlayın.
- matchManager ve gameSettings adlı değişkenler ekleyin. Her değişkenin kendi skriptine ihtiyaç duymasını sağlayın.
-- 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"))Değişkenlerden sonra, bir while true do döngüsü ekleyin. Oyun döngüsünün tüm aşamaları süresiz tekrarlanmak üzere içeri gidecektir.
-- Modül Kodlarılocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Ana oyun döngüsüwhile true doend
M molası kodlayın
Oyun döngüsü süresiz olarak çalışırken, mola döngüyü durdurmalı ve sadece bir eşleşmeiçin yeterli oyuncu olduğunda devam etmelidir.Bu duraklamayı kodlamak için, mola için while döngüsünde iç içe geçmiş bir tekrar döngüsü ekleyin.Bu yerleşik döngü, yeterli sayıda oyuncu olana kadar tekrarlanacak ve ana döngüyü duraklatacaktır.Yeterli oyuncu olduğunda, oyuncuları bir eşleşmeçıkarıp geçiş yapacaktır.
Bir tekrar döngüsü ile, döngüdeki kod en az bir kez çalışacaktır.Bir while döngüsünden farklı olarak, döngü bitene kadar koşulunu kontrol etmez.Bu, oyuncuların her zaman bir eşleşmeönce lobiye gitmesini sağlar.
while true do döngüsünde, anahtar kelime ile otomatik tamamlanmak için repeat yazın ve Enter basın ile anahtar kelime ile otomatik tamamlanmak için until .
while true dorepeatuntilendMevcut oyuncu sayısı (#Players:GetPlayers()) daha büyük veya GameSettings modülünde daha önce oluşturulan minimumPlayers değişkenine eşit olup olmadığını kontrol edin.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendTekrarlayan döngüde, mola başladığını belirten bir yazım ifadesi ekleyin.OyunAyarlarından task.wait() kullanarak mola vermeyi duraklatmak için intermissionDuration kullanın.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendOynatma testi yapın ve yazım ifadesinin en az iki kez gösterildiğinden emin olun "Starting intermission" .Mesajı iki kez görmek, tekrar eden döngünün yeterli oyuncu bulmadığını ve tekrar çalıştığını kanıtlar.Mesajı ikinci kez görmeden önce mola süresini beklemek zorunda kalacaksınız.
Sorun giderme ipuçları
Bu noktada, niyet edildiği gibi yaratmıyorsanız, aşağıdakilerden birini deneyin.
- task.wait() tekrar döngüsünün içinde olmalıdır.Bekleme olmadan, senaryo bir saniye içinde çok kez çalışacak ve Roblox Studio'yu aşırı yükleyecek ve bir hata verecek.
- Oyun Ayarları modunda, değişken intermissionDuration 1'den büyük olmalıdır. Eğer daha düşükse, senaryo çok sık tekrarlanabilir ve yavaşlama sorunlarına neden olabilir.
M molasını bitir
Yeterli oyuncu olduğunda, kısa bir geçiş süresi beklemelerini sağlayın.Sonra, onları Maç Yöneticisindeki prepareGame() işlevini çağırarak maça gönderin.Unutma, bu işlev sadece bir satır basar, ancak daha sonra daha fazla kod ekleyeceksin.
Tekrar döngüsünün sonunda, aradan çıkmanın kodunuzu test etmek için sona erdiğini belirten bir yazıcı ifadesi ekleyin.Sonra, bunu GameSetting'in değişkeni kullanarak takip edin.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endBeklemeden sonra, MatchManager modülünden prepareGame() 'yi arayın.Kod çalıştığında, bu sadece Çıktı penceresine metin basacaktır.Bu kodu test etmek için bir sonraki bölüme kadar bekleyin.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Çok oyunculu oyunları test et
Şu anda, kodun çalışması için prepareGame() , tekrar döngüsünden çıkması gerekiyor.Ancak, bunu yapmak için birden fazla oyuncu olması gerekiyor.Yani oyun testi düğmesini kullanırsanız, işlev asla çalışmayacak çünkü oyundaki tek oyuncusunuz (minimum oyuncunuz bir olmadıkça).Bunu test etmek için, çok oyunculu bir oyunu simüle etmeniz gerekecek.
Yerel bir sunucu başlatın
Birden fazla oyuncu gerektiren kodu test etmek için, yerel bir sunucu oluşturun.Yayınlanmış oyunlar normalde Roblox sunucularında bulunurken, bir yerel sunucu simüle edilen oyuncularla bilgisayarınızda çok oyunculu bir oyunu simüle eder.
Yerel bir sunucu başlatmak için, Test sekmesinde > Müşteriler ve Sunucular bölümünde > oyuncu düşürmeyi GameSetting'in değişken minimumPlayers sayısına ayarlayın.Bu ders 2 oyuncu kullanır.
sunucubaşlatmak için Başlat'a tıklayın.
Sunucunun kurulması için birkaç saniye bekleyin.Orijinal Studio penceresine ek olarak birden fazla pencere açılacaktır.Roblox Studio'ya erişime izin vermeniz gerekebilir firewall'lardan veya diğer online güvenlik yazılımlarından.
Sorun giderme ipuçları
Bu noktada, test sunucularını göremiyorsunuz, aşağıdan birini deneyin.
- Sunucunun başlatılmasıyla ilgili herhangi bir sorununuz varsa, makale Ateş Duvarı ve Yönlendirici Sorunları 'ı iki kez kontrol edin.
- Oyuncu sayısını 2 veya 3 gibi ufak bir miktara ayarlayın.
- Sorun çözülmediyse, Studio'yu yeniden başlatmayı veya bilgisayarınızı yeniden başlatmayı deneyin.
Yerel sunucuda test et
Sunucu başladığında çok sayıda pencere göreceksiniz. Her biri, sunucu/istemci ilişkisinin farklı bir parçasını temsil eder.
- Sunucu (yeşil sınır) oyunu çalıştırır.
- Müşteri (mavi sınırlar) bir oyuncunun deneyimini simüle eder.


Sunucu açık olduğunda, kodun çalışıp çalışmadığını kontrol edebilirsiniz.
Yeşil çerçeveli Sunucu penceresini bulun.MatchManager betiğinden çağrılan baskı ifadesini kontrol edin.Tekrarlayan bir döngü olduğundan, aynı yazım ifadelerinin tekrar edildiğini göreceksiniz.
Testten sonra, herhangi bir pencerede, temizleme düğmesiyle sunucuyu kapatın.Bu, tüm Sunucu ve İstemci pencerelerini kapatır ve normal Studio penceresine geri döndürür.
Sorun giderme ipuçları
Bu noktada, hedeflenen yazım ifadeleri görünmediyse, aşağıdakilerden birini deneyin.
- prepareGame() gibi işlevlerin while do döngüsünün sınırında olduğundan emin olun.
- Eğer MatchManager'dan yazdırma çalışmıyorsa, MatchManager scriptinin GameManager'da gerekli olduğundan emin olmak veya bu modülün tablosuna prepareGame() eklenmesi gibi bazı yaygın sorun giderme yöntemlerini kontrol edin.
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"))-- Ana oyun döngüsüwhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
MaçYöneticisi skripti
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
OyunAyarları scripti
local GameSettings = {}-- Oyun DeğişkenleriGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings