Oyuncuları yönet

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

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.

  1. 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 İşlevleri
    return PlayerManager
  2. takip 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 = {}
    -- 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 = {}
    -- Yerel Fonksiyonlar
    -- Modül İşlevleri
    return PlayerManager
  3. İçinde bir test baskısı bulunan sendPlayersToMatch() adlı bir modül işlevi oluşturun.


    -- Yerel Fonksiyonlar
    -- Modül İşlevleri
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return 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.

  1. 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 Fonksiyonlar
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Modül işlevinizin altına bir etkinlik bölümü ekleyin. Ardından, onPlayerJoin() oyuncu hizmetinin PlayerAdded etkinliğine bağlanın.


    -- Modül İşlevleri
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- Etkinlikler
    Players.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.

  1. 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 = {}
    -- 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
  2. Test 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.
  3. 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() .

  1. 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 Fonksiyonlar
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Modül İşlevleri
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. oyuncuyeniden doğma konumunu whichSpawn olarak ayarlayın.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Karakteri yeniden yüklemeye zorlayın, LoadCharacter() kullanarak, ve oyuncu yeni atanmış yerini kullanarak yeniden doğacaktır.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player: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.

  1. 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 İşlevleri
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Tü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() do
    end
    end

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.

  1. 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() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. Arena'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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Ç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() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Oyuncuları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.

  1. Silahı Alet Çubuğundan ithal edin veya kendi oluşturun (bakın Tools ).

  2. 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.

  1. PlayerManager'da, ServerStorage'daki Silah için adı playerWeapon olan bir değişken ekleyin.


    -- 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
  2. In preparePlayer() , oyuncunun karakterini almak için aşağıdaki kodu yapıştırın.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. Kı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 = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    local sword = playerWeapon:Clone()
    sword.Parent = character
    end
  4. Her 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


-- Hizmetler
local 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 do
repeat
task.wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("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