Oyun döngüsü kodlanmış olarak, özellikleri eklemek için eve başlamak zamanı. Bir eşleşmesırasında, oyuncular gelip git. Bu nedenle, kod aktif oyuncuları takip etmek ve bir maç göndermek gibi görevler için gereklidir. Bu görevleri yönetmek için PlayerManager adında bir modül kodu oluşturun.
Bu senaryo, bir silah ile oyuncuları arenaya göndermek için bir işlev başlatacak ve seride daha sonra genişletilecek.
Script'i Ayarlama
Oyun yöneticisi diğer kullanıcı kodlarını kullanan işlevleri içeriyor, bu yüzden bir modül kodu olacaktır.
ServerStorage > ModülScripts'te, PlayerManager adında yeni bir modül script'i ekleyin. Sonra, modül tablosunu özelleştirmeye uygun script ismiyle yeniden adlandırın ve yerel ve modül işlevleri için yorumlar ekleyin.
local PlayerManager = {}-- Yerel Fonksiyonlar-- Modülasyon Fonksiyonlarıreturn PlayerManagertakip edileniçin yerel ortam değişkenleri ekleyin:
Hizmetler:
- Oyuncular - Oyuncuların katıldığını veya oyundan ayrıldığını bilin.
- ServerStorage - Oyuncu silahları için depolama.
Harita ve Oyuncu Değişkenleri:
- Lobi Oluşturma, Arena Folder ve Arena Spawn Folder - Oyuncuları farklı alanlara ışınlamak için kullanılır.
- Aktif Oyuncular Bir Matrisi - Oyuncuların şu anda bir oyunda olduğunu takiben tutar.
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ülasyon Fonksiyonlarıreturn PlayerManagerTest içinde bir sendPlayersToMatch() adında bir modül işlevi oluşturun.
-- Yerel Fonksiyonlar-- Modülasyon Fonksiyonlarıfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn PlayerManager
Lobiye Oyuncular Oluşturulması
Şu anda, çeşitli yerleşme yerleri var, yani oyuncular oyuna katıldığında rastgele bir yerde oluşturulur. Oyuncuları lobide oluşturmak için oyuncunun RespawnLocation özelliğini değiştirin.
- onPlayerJoin() ile bir yerel işlev oluştur, player . Bu işlevde, oyuncunun yeniden doğma konumunu daha önce oluşturulan lobby doğma değişkenine ayarlar.
-- Yerel Fonksiyonlar
local function onPlayerJoin(player)
player.RespawnLocation = lobbySpawn
end
Modülünüzün altında bir etkinlik bölümü ekleyin. Sonra, onPlayerJoin() oyun hizmetine bağlayın PlayerAdded etkinliğine.
-- Modülasyon Fonksiyonlarıfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- EtkinliklerPlayers.PlayerAdded:Connect(onPlayerJoin)
Bağlama ve Test
Şimdi modüller bağlanabilir ve test edilebilir. PlayerManager oluşturulduktan sonra, o modül kodunun oyunculara gönderilmesini ve lobiye gönderilmesini sağlayın.
Maç Yöneticisi ile geri dönün ve takip edilendeğişkenleri oluşturun:
- ServerStorage hizmeti.
- ModuleScripts dizin, ServerStorage'ın çocuğu.
- PlayerManager modül kesişim scripti, moduleScripts'in ç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 MatchManagerEn azından test için en az oyuncu ile bir yerel sunucu kullanın. Onu görebileceğinizden emin oluntakip edilen
- Tüm oyuncular Lobi'de oluşturulur.
- PlayerManager'ın çıktısı, Çıktı Penceresinde görünür.
Bittiğinde, sunucuyu kapatmak için Temizle'ye tıklayın.
Hata ayıklama ipuçları
Bu noktada, kodun bazı kısımları beklediğiniz gibi çalışmıyor, aşağıdaki birinden deneyin.
- Arena veya Lobby > StartSpawn'ın konumunu kontrol edin, özellikle dersinde belirtilenlerden farklı isimler verdiyseniz.
- Modüllerin require() işlevini kullanarak her bir senaryoda gerekli olduğundan emin olun ve doğru yazıldığından emin olun.
Oyuncuları Arenaya Göndermek
Oyuncular artık lobide yer aldıklarında, arada bir mola bitinceye kadar onları bir maça ışınlatın. oyuncuRespawnLocation ını açıklandığında kullanıcının ReloadCharacter() ını kullanarak arenadaki bir yerleştirme noktasına ışınlatın.
Oyuncu Yönetici'ne git, aşağıda onPlayerJoin() , yeni bir yerel işlev olan onPlayerJoin() ekleyin. İki parametreyi içerir: preparePlayer() ve 2> whichSpawn2>, yerleştirme konumunu gönderen yerleştirme konumunu içerir.
local activePlayers = {}-- Yerel Fonksiyonlarlocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Modülasyon Fonksiyonlarıfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endoyuncuyeniden doğma konumunu whichSpawn ile ayarla.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendKarakteri yeniden yüklemeyi zorla, kullanarak LoadCharacter() , ve oyuncu yeni atanmış konumlarını kullanarak yeniden doğacak.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()end
Oyuncuları Spawn'a Göndermek
Arena'da her oyuncuya aktif oyuncu arkasındaki farklı bir yere ışınlanmak için bir for döngüsü kullanarak her oyuncunun yerini değiştirin. Kullanmak için bir for döğüsü kullanın.
In the sendPlayersToMatch() function, use a variable to create an array of all the arena spawn locations by getting the children of the Arena > SpawnLocations folder.
--Modülasyon Fonksiyonlarıfunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endAşağıdaki for loop ekleyin bir dizi tüm oyuncuları alın ve ardından her birinden itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itibaren itib
function PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() doendend
İzleme ve Oluşturma
Oyun çalıştığında, hangi kullanıcıların oynadığını belirlemesi gerekir, böylece arenada oluşturulabilirler. Bir turun başlangıcında, her oyuncu aktif oyuncuların bir matrisinde izlenecektir. Bu matris, oyuncuların lobide kalan oyuncuların etkilenmemesini sağlayacak şekilde kullanılacaktır.
For döngüsünde, table.insert() kullanırken, player'ı eklemek için iki parametre kullanırız.
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ştur ve ilk indeksi ile arenaSpawns tablosunda ayarla.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endCall preparePlayer() ve whichPlayer ve spawnLocation ile çağrınızı yapın ve ardından, bu oluşturma konumunu kullanıldığından 1> kaldır1> onu tablodan, böylece bir sonraki oyuncu farklı bir oluşturma konumu alır.
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 edin. Oyuncular aynı yerde devam edecek çünkü gönderilecek kod henüz lobide dünya.
Hata ayıklama ipuçları
Bu noktada, niyetlenen sonuçları görmediniz, aşağıdaki birinden deneyin.
- In GetPlayers() , açıklamadaki iki kapatıcı eşik var, wielecekleri gibi Class.Players.GetPlayers() .
- Modül kodlarındaki işlev çağrılarının serisini kontrol edin. Örneğin, matchManager.prepareGame() modül kodlarında playerManager.sendPlayersToMatch() çağrılmalıdır.
Oyunculara Silahlar Verme
Bir tur başladığında, arenadaki her oyuncuya kullanılacak bir silah verilecek.
Bir Eklentiyi Ekleme
Oyuncu silahları bir araç olacaktır. Roblox'daki herhangi bir araç kullanılabilir, ancak başlatiçin bir örnek kılıç sağladık.
Silahı Kutuyaktan İçe aktar veya kendi yap (görüntüye bakın Tools ).
Silahı ServerStorage'a yerleştirin. Kendi araçınızı oluşturuyorsanız, araç çiftliğine Weapon adı verin, çünkü bu daha sonraki kodlarda kullanılacaktır.
Oyunculara Aletler Verilmesi
Araç artık depolanmıştır, aktif oyuncu arayüzünü geçmek için bir kript üzerinde çalışın ve her kullanıcıya araç sağlayın.
PlayerManager'da, playerWeapon için 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() , oyuncu'ın 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 Clone() işlevini kullanarak silahın bir kopyasını oluşturun. Sonra, kılıcı oyuncunun karakterine ebeveyn yapın.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendArena'ya gönderilen her oyuncuya bir araç aldığından emin olmak için yerel bir sunucuda test yapın. Aklınızda bulundurun, eğer testi sürdürürseniz, mola süresi her birkaç saniye yeniden başlatılacak ve oyuncular her birkaç saniye yeniden doğacak. Bu, bir sonraki dersinde çözülecek.
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"))while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
MatchManager Yazılımı
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
PlayerManager Modül Kısmı
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ülasyon Fonksiyonları
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