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

  1. 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 PlayerManager
  2. takip 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 = {}
    -- 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ülasyon Fonksiyonları
    return PlayerManager
  3. Test 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")
    end
    return 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.

  1. 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
  1. 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
    -- Etkinlikler
    Players.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.

  1. 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 = {}
    -- 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. En 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.
  3. 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.

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


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Karakteri yeniden yüklemeyi zorla, kullanarak LoadCharacter() , ve oyuncu yeni atanmış konumlarını kullanarak yeniden doğacak.


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

  1. 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()
    end
  2. Aş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() do
    end
    end

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

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

  1. Silahı Kutuyaktan İçe aktar veya kendi yap (görüntüye bakın Tools ).

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

  1. PlayerManager'da, playerWeapon için 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() , oyuncu'ın 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 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 = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    local sword = playerWeapon:Clone()
    sword.Parent = character
    end
  4. Arena'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


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

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