Harita oluşturulduktan sonra, senaryolardaki tüm farklı öğeleri oluşturmaya başlayabilirsiniz. Bu kursun geri kalanı, oyun bağlantısının tüm farklı öğelerine odaklanacaktır.
Script'leri ayarlama
Savaş royalesi, modül scriptleri ve normal scriptleri bir kombinasyon kullanacak. Aşağıda, bu kodlar ve işlevleri vardır.
GameManager | Script. Game Settings'den Game'e kullanıcı değiştiricilerini 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 etme gibi işlevleri yürütür. |
Oyun Ayarları | Modül Kodu. Diğer kodlar tarafından kullanılan sık kullanılan değişkenleri depolar. |
GameSettings Yazılımı
Oyun Ayarları adında bir modül k scripti oluşturarak diğer kullanıcıların kullandığı ortak değişkenleri saklayın. Bu ortak değişkenler daha sonra GameManager kullanıcı tarafından kullanılacaktır.
In ServerStorage , bir "ModuleScripts" adında bir klasör oluşturun. Bu klasörde, GameSettings adında yeni bir modül scripti oluşturun.
GameSettings'ı aç ve modül tablosunu özellik adına uygun şekilde yeniden adlandır.
local GameSettings = {}return GameSettingsModül tabelinde, aşağıdaki kullanımlar için değişkenler ekleyin. Her değer için en iyi tahmininizi alın, test sırasında her zaman değiştirebilirsiniz.
- Molma Süresi - Oyuncular bir eşleşmeönce bekleme süreleri.
- Maç Süresi - Bir maçın saniyeler içindeki uzunluğu.
- En az oyuncu sayısı - başlatiçin gerekli en küçük oyuncu sayısı.
- Geçiş Süresi - Oyun bağlantısının saniyeler içinde gerçekleşmesinden önce ve sonra geçiş süresi. Oyun bağlantısının parçaları arasındaki geçişi daha az bekleyici hale getirir.
local GameSettings = {}-- Oyun DeğişkenleriGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
MatchManager Yazılımı
GameManager'a bağlanan ikinci senaryo MatchManager'dir. Bu senaryo, oyunun başlangıcını takib etmek veya oyuncuların maçı bitirdiğinde yeniden ayarlamak gibi görevleri yönetir.
MatchManager'ın içinde prepareGame() adında bir işlev var. Bu, oyuncuları eşleşmedönüştürerek oyunu başlatır.
ServerStorage > ModuleScripts > MatchManager adında bir modül scripti ekleyin. Modül tablosunu yeniden adlandırın.
local MatchManager = {}return MatchManagerMatchManager adındaki yeni bir modül işlevi ekle. Skripti daha sonra test etmek için bir print ifadesi ekleyin.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
Oyun Kodlanması
Ana oyun döngüsü oluşturulan değişkenleri kullanarak GameManager kriptinde kodlanacak. Hatırlayın, oyun döngüsünde üç faz vardır: mola, rekabet ve temizleme ve sıfırlama.
GameManager Komutu
Bu senaryo normal bir sunucu senaryosu, bu yüzden ServerScriptService'e, modül skriptleri klasörüne değil, bir while true do loop olacaktır.
ServerScriptService'de, GameManager adında yeni bir senaryo oluşturun.
Modül Kriptlerinin bulunduğu yer olan "ServerStorage" için bir değişken ekleyin. Sonra "Oyuncular" hizmetine, mola sırasında oyuncu sayısını kontrol etmek için gereken bir değişken ekleyin.
-- Hizmetlerlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Daha önce oluşturulan modüller kullanılmak üzere:
- moduleScripts adında bir değer moduleScripts dizinine yerleştirin.
- matchManager ve gameSettings adındaki ortak değişkenleri ekleyin. Her bir ortak değişkenin kendi skriptini gerektirmesini 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ı sonsuza kadar tekrarlanacaktır.
-- 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
Mola Kodlanması
Oyun çözgüsü sonsuza kadar çalışırken, mola süresi oyunu durdurmalı ve sadece bir eşleşmeiçin yeterli oyuncu olduğunda devam etmelidir. Bu molayı kodlamak için, ana döngü için bir alt döngü oluşturun. Bu döngü alt döngü içinde sürecek ve bir maç için oyuncuları bir eşleşmeiçin geçişt
Bir 반복 özelliği ile, bu özellikteki kod en az bir kere çalışacaktır. Bir while özelliği ile aynı değildir, oyuncuların maçtan önce her zaman lobiye gittiğinden emin olur. Bu, oyuncuların her zaman eşleşmeönce lobiye gittiğinden emin olur.
In the while true do loop, type repeat and press Enter to autocomplete with the keyword 1> until1> .
while true dorepeatuntilendOyun Ayarları modülünde daha önce oluşturulan <a href="/reference/engine/datas">minimumPlayers</a> değerine eşdeğer veya daha büyük oyuncu sayısı ile şu andaki oyuncu sayısı arasında oynanıyor.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendTekrarlanan bir döngüde, mola başladığını söyleyen bir print ifadesi ekleyin. task.wait() kullanarak mola için intermissionDuration durdurmayı kullanırken print statement kullanır.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendYazdırma ifadesi "Starting intermission" ít nispetle gösterildiğinden emin olun. Mesajı iki kez görmek, tekrar gösterilmeyen yeterli oyuncu bulmadığını kanıtlar ve tekrar çalıştırılır. İkinci kez mesajı görmek için bekleme süresini beklemek zorunda kalacaksınız.
Hata ayıklama ipuçları
Bu noktada, planlanan gibi yapmıyorsanız, aşağıdaki birinden deneyin.
- task.wait() sollte içinde tekrar eden döngü içinde olmalıdır. Bekleme olmadan, kod çok fazla bir saniye içinde çalışacak ve Roblox Studio'yu aşırı yüklemeye ve bir hata oluşturana neden olacaktır.
- Oyun Ayarları modülünde, intermissionDuration değeri 1'den büyük olmalıdır. Eğer daha düşükse, kod çok yeniden yüklenir ve yavaşlatma sorunları oluşturur.
Molayı Sonlandırma
Yeterli sayıda oyuncu olduğunda, onları kısa bir geçiş süresiyle bekletin. Sonra, MatchManager'da prepareGame() işlevini çağırın. Unutmayın, bu işlev sadece bir satır yazdırır, ancak daha sonra daha fazla kod ekleyeceksiniz.
Tekrarlanan döngünün sonunda, aradaşıklığınızı test etmek için mola bitişini belirtir bir print ifadesi ekleyin. Sonra, GameSettings'ın task.wait() değişkenini kullanarak bir transitionTime ifadesini takip edin.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endBekledikten sonra, MatchManager modülünden prepareGame() çağırın. Kod çalıştığında, bu sadece kodu çıktı penceresine yazacaktır. Bekleme kodu test etmek için bir sonraki bölüme 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 etme
Şu anda, kodu çalıştırmak için prepareGame() gerekir. Ama bunu yapmak için, tekrar tekrar döngüsünden çıkmak gerekir. Fakat bunu yapmak için, playtest düğmesini kullanıyorsanız, kod asla çalışmaz çünkü sadece oyunun minimum oyuncusunuz (ya da o
Yerel Bir Sunucuyu Başlatma
Tek bir oyuncu daha fazla oynatan kodu test etmek için yerel bir sunucu oluşturun. Yayınlanmış oyunlar normalde Roblox sunucusunda bulunur, ancak bir yerel sunucu simüle edilmiş oyunu bilgisayarınızda oynatır.
Yerel bir sunucuyu başlatmak için, Test sekmesinin Klişeler ve Sunucular bölümünde > oyun ayarlarının minimum oynatıcı sayısına oyuncu dropdown'ını ayarlayın. Bu ders 2 oyuncu kullanıyor.
sunucubaşlatmak için Başlat'a tıklayın.
Sunucunun kurulması için birkaç saniye bekleyin. Orijinal Studio pencerenizin yanı sıra birkaç pencere Roblox Studio'yu açacaktır. Ağ yönlendiricilerden veya diğer online güvenlik yazılımından Roblox Studio'ya erişimi izin vermeniz gerekebilir.
Hata ayıklama ipuçları
Bu noktada, test sunucularını göremiyorsunuz, aşağıdaki birinden deneyin.
- Sunucunun başlangıcında herhangi bir sorun varsa, makalenin Firewall ve Router Issues bölümünü ikiye katlayın.
- Oyuncu sayısını 2 veya 3 gibi küçük bir sayıya ayarlar.
- Eğer sorun çözülmezse, Studio'yu yeniden başlatmayı deneyin veya bilgisayarınızı yeniden başlatın.
Yerel Sunucuda Test
Sunucu başladığında çok sayıda pencere göreceksiniz. Her biri, sunucu/klien ilişkisinin farklı bir parçasını temsil eder.
- Sunucu (yeşil sınır) oyunu çalıştırır.
- Müşteri (mavi çizgiler) bir oyuncunun deneyimini simüle eder.
Sunucu açık olduğunda, kodun çalıştığını kontrol edebilirsiniz.
Yeşil sınırlı Sunucu penceresini bulun. MatchManager kullanıcı kayısından çağrılan baskı deklarasyonunu kontrol edin. Çünkü tekrarlanan bir dizi görüntülenir.
Testlerinizi tamamladıktan sonra, herhangi bir pencerede, Temizleme düğmesine basarak sunucuyu kapatın. Bu, tüm Sunucu ve Klient pencerelerini kapar ve normal Studio pencerenize geri döndürür.
Hata ayıklama ipuçları
Burada, planlanan yazılımlar görünmediyse, aşağıdaki birinden deneyin.
- 準備Game() ile ilgili işlevlerin 루프 içinde olduğundan emin olun.
- MatchManager'ın yazdırması problemli değilse, bazı modül kaynaklı sorunların ortaya çıkmasına izin verin, modül kaynaklı sorunların ortaya çıkmasına izin verin, bununla birlikte prepareGame()'in bu modülün tablosuna eklenmesine izin verin.
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"))-- 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
MatchManager Yazılımı
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
GameSettings Yazılımı
local GameSettings = {}-- Oyun DeğişkenleriGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings