Oyun döngüsü kodlandıktan sonra, buna özellikler eklemeye başlama zamanı geldi.Bir eşleşmesırasında, oyuncular gelip git.Bu nedenle, oyuncuları bir maça göndermek ve aktif oyuncuları takip etmek gibi görevler için kod gereklidir.Bu görevleri yönetmek için, Oyun Yöneticisi adlı bir modül senaryosu oluşturun.
Bu senaryo, oyuncuları bir silahla arenaya göndermek için bir işlev başlatacak ve daha sonra seride genişletilecek.
Senaryoyu kurun
Oyun yöneticisinin diğer senaryolarda kullanılan işlevleri içerdiğinden, bir modül senaryosu olacaktır.
ServerStorage > ModülScriptları'nda, PlayerManager adlı yeni bir modül senaryosu ekleyin.Sonra, modül tablosunu senaryo adına uyacak şekilde yeniden adlandırın ve yerel ve modül işlevleri için yorumlar ekleyin.
local PlayerManager = {}-- Yerel Fonksiyonlar-- Modül İşlevlerireturn PlayerManagertakip edileniçin yerel değişkenler ekleyin:
Hizmetler:
- Oyuncular - Oyuncuların oyuna katıldığını veya oyundan ayrıldığını bilin.
- ServerStorage - Oyuncu silahları için depolama.
Harita ve Oyuncu Değişkenleri:
- Lobi oluşturma, Arenas Klasörü ve Arenas oluşturma klasörü - Oyuncuları farklı alanlara ışınlamak için kullanılır.
- Aktif Oyuncu Dizisi - Şu anda bir oyunda olan oyuncuların izini sürer.
local PlayerManager = {}-- Hizmetlerlocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Harita Değişkenlerilocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Oyuncu Değişkenlerilocal activePlayers = {}-- Yerel Fonksiyonlar-- Modül İşlevlerireturn PlayerManagerİçinde bir test baskısı bulunan sendPlayersToMatch() adlı bir modül işlevi oluşturun.
-- Yerel Fonksiyonlar-- Modül İşlevlerifunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn PlayerManager
Lobide oyuncuları oluşturun
Şu anda, birden fazla oluşturma konumu var, yani oyuncular oyuna katıldığında rastgele birinde oluşuyor.Oyuncuların lobide doğmasını sağlamak için, oyuncunun RespawnLocation özelliğini değiştirin.
Yeni bir yerel işlev oluştur onPlayerJoin() ile bir parametre ile player .Bu işlevde, oyuncunun yeniden doğma konumunu daha önce oluşturulan lobi oluşturma değişkenine ayarlayın.
-- Yerel Fonksiyonlarlocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendModül işlevinizin altına bir etkinlik bölümü ekleyin. Ardından, onPlayerJoin() oyuncu hizmetinin PlayerAdded etkinliğine bağlanın.
-- Modül İşlevlerifunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- EtkinliklerPlayers.PlayerAdded:Connect(onPlayerJoin)
Bağla ve test et
Artık modüller bağlanabilir ve test edilebilir.Oyun Yöneticisi oluşturulduktan sonra, bu modül kriptindeki kodun çalışmasını ve oyuncuları lobiye göndermesini sağlamak için bunu gerektirin.
Maç Yöneticisine geri dönün ve takip edileniçin değişkenler oluşturun:
- Sunucu Depolama hizmeti.
- ModülScriptleri klasörü, ServerStorage'un yavrusu.
- Oyuncu Yöneticisi modül scripti, modülScriptlarının çocuğu.
local MatchManager = {}-- Hizmetlerlocal ServerStorage = game:GetService("ServerStorage")-- Modül Kodlarılocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerTest etmek için en az minimum oyuncularla bir yerel sunucu kullanın. takip edilengörebileceğinizi onaylayın:
- Tüm oyuncular Lobi'de doğar.
- Oyun Yöneticisinden yazdırma ifadesi Çıktı penceresinde görünür.
Bittiğinde, sunucuyu kapatmak için Temizle'ye tıklayın.
Sorun giderme ipuçları
Bu noktada, senaryonun bazı bölümleri niyet edilen şekilde çalışmıyor, aşağıdakilerden birini deneyin.
- Arena gibi parçaların adını veya Lobi > StartSpawn'un yerini kontrol edin, özellikle derslerde talimat edilenlerden farklı adlandırdıysanız.
- Modüllerin her kullanılan senaryoda require() fonksiyonu kullanılarak ve doğru şekilde yazıldığından emin olun.
Oyuncuları arenaya gönder
Artık oyuncular lobide oluştu, aradan sonra bir maça ışınlansınlar.Oyuncunun RespawnLocation 'sini arenadaki bir oluşturma konumuna bir işlev kullanarak oyuncu nesnesi Player'da değiştirin ReloadCharacter() .
Oyuncu Yöneticisi skriptine gidin, aşağıda , yeni bir yerel işlev adında ekleyin.İki değer dahil edin: player ve whichSpawn , bunları göndermek için yerleşim yeri.
local activePlayers = {}-- Yerel Fonksiyonlarlocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Modül İşlevlerifunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endoyuncuyeniden doğma konumunu whichSpawn olarak ayarlayın.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendKarakteri yeniden yüklemeye zorlayın, LoadCharacter() kullanarak, ve oyuncu yeni atanmış yerini kullanarak yeniden doğacaktır.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
Oyuncuları doğmaya gönder
Her oyuncunun, aktif oyuncu sayısını döndürmek için bir for döngü kullanarak arenadaki farklı bir oluşturma konumuna ışınlandığından emin olun.Bir for döngüsü kullanmak, oyuncuların dizisindeki her değeri geçmenize izin verir, böylece senaryo çeşitli oyuncu sayılarına adapte olabilir.
sendPlayersToMatch() fonksiyonunda, bir değişkeni kullanarak tüm arenaspor yerlerinin bir dizi oluşturmak için Arena > SpawnLocations klasörünün çocuklarını alarak kullanın.
--Modül İşlevlerifunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endTüm oyuncuların bir dizi almak için aşağıdaki for döngüsünü ekleyin ve ardından her birinden dolaşın. Oyuncuları almak için: Players:GetPlayers() yazın.
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() doendend
Takip et ve oluştur
Oyun çalıştığında, hangi kullanıcıların oynadığını tanımlaması gerekir, böylece arenada üretilebilirler.Bir turun başında, her oyuncu aktif oyuncuların bir diziinde izlenecektir.Bu dizi, teleport veya silah ataması gibi farklı işlevler için kullanılacak ve oyuncuların bir tur sırasında lobide kalmasının etkilenmediğinden emin olacaktır.
for döngüsünde, table.insert() , activePlayers dizisine ve eklemek için oyuncuya iki parametre kullanarak kullanın.
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)endendArena'dan bir oluşturma konumu almak için, spawnLocation adlı bir değişken oluşturun ve bunu ilk indeksine ayarlayın arenaSpawns tablosunda.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endÇağrı preparePlayer() ve geç whichPlayer ve spawnLocation .Sonra, bu oluşturma konumu kullanıldığından, kaldır masadan çıkarın, böylece bir sonraki oyuncu farklı bir oluşum alacak.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endOyuncuların arenaya gönderildiği yerel bir sunucuda test yapın.Oyuncular aynı yerde yeniden doğmaya devam edecekler çünkü onları lobiye geri göndermek için kod henüz dünyadeğil.
Sorun giderme ipuçları
Bu noktada, niyet edilen sonuçları görmediniz, aşağıdakilerden birini deneyin.
- In GetPlayers() , ifade içinde iki kapatma parantezi olduğundan emin olun, örneğin Class.Players.GetPlayers(|Players:GetPlayers()) ifadesinde.
- Modül kılavuzlarındaki işlev çağrıları serisini kontrol edin. Örneğin, matchManager.prepareGame() çağrısı playerManager.sendPlayersToMatch() yapmalıdır.
Oyunculara Silah Veriyor
Bir tur başladığında, arenadaki her oyuncu kullanacak bir silah verilecektir.
Bir araç ekleyin
Oyuncu silahları bir araç olacak. Roblox'taki herhangi bir araç kullanılabilirken, başlatiçin bir örnek kılıç sağladık.
Silahı Alet Çubuğundan ithal edin veya kendi oluşturun (bakın Tools ).
Silahı ServerStorage'a yerleştirin. Kendi aracınızı oluşturuyorsanız, aracın adı Silah olarak adlandırıldığından emin olun, çünkü daha sonra kullanılacak.
Oyunculara araçlar verin
Araç artık depolandı, şimdi aktif oyuncu dizesini geçmek ve her kullanıcıya bu araç sağlamak için bir senaryo üzerinde çalışın.
PlayerManager'da, ServerStorage'daki Silah için adı playerWeapon olan bir değişken ekleyin.
-- Harita Değişkenlerilocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Oyuncu Değişkenlerilocal activePlayers = {}local playerWeapon = ServerStorage.WeaponIn preparePlayer() , oyuncunun karakterini almak için aşağıdaki kodu yapıştırın.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()endKılıç adında yeni bir değişken oluşturun ve ServerStorage'da silahın bir kopyasını oluşturmak için Clone() işlevini kullanın.Sonra, kılıcı oyuncunun karakterine eşleştirin.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendHer oyuncunun arenaya gönderildiğinde bir araç aldığını onaylamak için yerel sunucuda test yapın.Aklınızda bulundurun, testlerinizi sürdürürseniz, mola devam edecek ve oyuncular her birkaç saniye içinde yeniden doğacak.Bu, bir sonraki dersde çözülecektir.
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"))while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
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"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager
Oyuncu Yöneticisi modül kodu
local PlayerManager = {}
-- Hizmetler
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Harita Değişkenleri
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Oyuncu Değişkenleri
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Yerel Fonksiyonlar
local function onPlayerJoin(player)
player.RespawnLocation = lobbySpawn
end
local function preparePlayer(player, whichSpawn)
player.RespawnLocation = whichSpawn
player:LoadCharacter()
local character = player.Character or player.CharacterAdded:Wait()
local sword = playerWeapon:Clone()
sword.Parent = character
end
-- Modül İşlevleri
function PlayerManager.sendPlayersToMatch()
print("Sending players to match")
local arenaSpawns = spawnLocations:GetChildren()
for playerKey, whichPlayer in Players:GetPlayers() do
table.insert(activePlayers, whichPlayer)
local spawnLocation = table.remove(arenaSpawns, 1)
preparePlayer(whichPlayer, spawnLocation)
end
end
--etkinlikler
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager