Mengelola Pemain

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Dengan game loop yang dikode, saatnya untuk mulai menambahkan fitur ke dalamnya. Selama mencocokkan, pemain dapat datang dan pergi. Karena ini, kode diperlukan untuk tugas seperti mengirim pemain ke pertandingan dan menyimpan catatan pemain aktif. Untuk mengelola tugas ini, buat script modul bernama PlayerManager .

Skrip ini akan memulai fungsi untuk mengirim pemain ke arena dengan senjata dan diperluas kemudian dalam seri.

Mengatur Skrip

Karena manajer pemain termasuk fungsi yang digunakan oleh skrip lain, itu akan menjadi modul script.

  1. Di ServerStorage > ModuleScripts, tambahkan naskah modul baru bernama PlayerManager. Kemudian, ganti nama tabel modul untuk mencocokkan nama script dan menambahkan komentar untuk lokasi dan fungsi modul.


    local PlayerManager = {}
    -- Fungsi Lokal
    -- Fungsi Modul
    return PlayerManager
  2. Tambahkan variabel lokal untuk mengikuti:

    Layanan:

    • Pemain - Tahu apa pemain telah bergabung atau meninggalkan game.
    • ServerStorage - Penyimpanan untuk senjata pemain.

    Variabel Peta dan Pemain:

    • Lobi Spawn, Arena Folder, dan Arena Spawn Folder - Digunakan untuk teleportasi pemain ke berbagai daerah.
    • Sebuah Matriks Tindakan - Menyimpan catatan pemain saat ini dalam game.

    local PlayerManager = {}
    -- Layanan
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    -- Variabel Peta
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Variabel Pemain
    local activePlayers = {}
    -- Fungsi Lokal
    -- Fungsi Modul
    return PlayerManager
  3. Buat fungsi modul bernama sendPlayersToMatch() dengan cetakan ulang pengujian di dalam.


    -- Fungsi Lokal
    -- Fungsi Modul
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    return PlayerManager

Memunculkan Pemain di Lobi

Saat ini, ada banyak lokasi bertelur, yang berarti bahwa pemain bertelur di lokasi acak saat bergabung dengan game. Untuk menjamin bahwa pemain bertelur di lobi, ubah property pemain RespawnLocation.

  1. Buat fungsi lokal baru bernama onPlayerJoin() dengan parameter player . Di fungsi itu, atur lokasi respawn pemain ke variabel respawn lobi yang dibuat sebelumnya.


    -- Fungsi Lokal
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
  2. Tambahkan seksi acara di bawah fungsi modul Anda. Kemudian, hubungkan onPlayerJoin() ke acara PlayerAdded di layanan Pemain.


    -- Fungsi Modul
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
    -- Acara
    Players.PlayerAdded:Connect(onPlayerJoin)

Meng연결 dan Menguji

Sekarang modul dapat dihubungkan dan diuji. Dengan PlayerManager yang dibuat, minta agar kode dalam skrip modul itu dapat kemudian dijalankan dan mengirim pemain ke lobi.

  1. Kembali ke MatchManager dan buat variabel untuk mengikuti:

    • layanan ServerStorage.
    • ModuleScripts folder, anak ServerStorage.
    • PlayerManager naskah modul, anak modulScripts.

    local MatchManager = {}
    -- Layanan
    local ServerStorage = game:GetService("ServerStorage")
    -- Skrip Modul
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Gunakan server lokal dengan setidaknya pemain minimum untuk diuji. Konfirmasi bahwa Anda dapat melihat mengikuti:

    • Semua pemain muncul di Lobi.
    • Pernyataan cetak dari PlayerManager muncul di Jendela Keluaran.
  3. Setelah selesai, klik Bersihkan untuk menutup server.

Tips Troubleshoot

Pada titik ini, beberapa bagian dari script tidak berfungsi seperti yang diharapkan, coba salah satu dari berikut.

  • Periksa nama bagian seperti Arena, atau lokasi Lobby > StartSpawn, terutama jika Anda menamainya secara berbeda dari yang diinstruksikan dalam lekcion.
  • Pastikan modul diperlukan dalam setiap skrip menggunakan fungsi require() dan benar-benar spelled.

Mengirim Pemain ke Arena

Sekarang para pemain muncul di lobi, teleport mereka ke pertandingan setelah istirahat selesai. Ganti RespawnLocation pemain menjadi lokasi bertelur di arena menggunakan fungsi dalam objek Pemain bernama ReloadCharacter() .

  1. Pergi ke script PlayerManager , di bawah onPlayerJoin(), tambahkan fungsi lokal baru bernama preparePlayer() . Masukkan dua parameter: 1> pemain1> dan 4> whichSpawn4>, lokasi spawn untuk mengirim mereka ke.


    local activePlayers = {}
    -- Fungsi Lokal
    local function onPlayerJoin(player)
    player.RespawnLocation = lobbySpawn
    end
    local function preparePlayer(player, whichSpawn)
    end
    -- Fungsi Modul
    function PlayerManager.sendPlayersToMatch()
    print("Sending players to match")
    end
  2. Tetapkan lokasi respawn pemain ke whichSpawn .


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    end
  3. Mengikuti karakter untuk memuat ulang, menggunakan LoadCharacter() , dan pemain akan respawn menggunakan lokasi baru yang baru ditetapkan.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    end

Mengirim Pemain ke Spawn

Pastikan setiap pemain diteleportasi ke lokasi berteluran yang berbeda di arena dengan menggunakan for loop untuk mengulangi melalui for array pemain. Menggunakan for loop memungkinkan Anda untuk pergi melalui setiap nilai dalam 1> for1> array pemain, memungkinkan skrip untuk beradaptasi dengan berbagai j

  1. Dalam fungsi sendPlayersToMatch(), gunakan variabel untuk menciptakan array dari semua lokasi bertelur di arena dengan mengambil anak-anak dari folder Arena > SpawnLocations.


    --Fungsi Modul
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Tambahkan for loop di bawah ini untuk mendapatkan matriks dari semua pemain dan kemudian mengulangi melalui masing-masing dari mereka. Untuk mendapatkan pemain, ketik: Players:GetPlayers() .


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    end
    end

Melacak dan Menghasilkan

Ketika permainan dijalankan, itu perlu mengidentifikasi pengguna mana yang bermain sehingga mereka dapat dibawa ke arena. Pada awal setiap putaran, setiap pemain akan diperdagangkan dalam serangkaian pemain aktif. Arrays ini akan digunakan untuk berbagai fungsi, seperti teleportasi atau menetapkan senjata, memastikan bahwa pemain masih di lobi selama putaran.

  1. Dalam for loop, gunakan table.insert() , menggunakan dua parameter untuk activePlayers array dan pemain untuk tambah.


    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    end
    end
  2. Untuk mendapatkan lokasi bertelur dari arena, buat variabel bernama spawnLocation dan tetapkan ke pertama indeks di tabel arenaSpawns.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Panggil preparePlayer() dan berikan dalam whichPlayer dan spawnLocation. Kemudian, karena lokasi bertelur itu digunakan, 1> hapus1> dari tabel sehingga pemain berikutnya mendapatkan bertelur yang berbeda.


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = table.remove(arenaSpawns, 1)
    preparePlayer(whichPlayer, spawnLocation)
    end
  4. Tes di server lokal di mana pemain dikirim ke arena . Pemain akan terus muncul kembali di lokasi yang sama karena kode untuk mengirim mereka kembali ke lobi belum ada.

Tips Troubleshoot

Pada titik ini, Anda tidak melihat hasil yang diharapkan, coba salah satu dari berikut.

  • Dalam GetPlayers() , pastikan ada dua penutup huruf, seperti Class.Players.GetPlayers(|Players:GetPlayers()) dalam pernyataan.
  • Periksa serangkaian panggilan fungsi dalam script modul. Misalnya, matchManager.prepareGame() seharusnya memanggil playerManager.sendPlayersToMatch().

Memberikan Pemain Senjata

Ketika putaran dimulai, setiap pemain di arena akan diberi senjata untuk digunakan.

Menambahkan Alat

Senjata pemain akan menjadi alat. Meskipun setiap alat di Roblox dapat digunakan, kami telah menyediakan contoh pedang untuk memulai.

  1. Impor senjata dari Toolbox, atau buat sendiri (lihat Tools).

  2. Tempatkan senjata ke ServerStorage. Jika Anda membuat alat Anda sendiri, pastikan alat itu bernama Senjata, karena itu akan digunakan dalam skrip selanjutnya.

Memberikan Alat ke Pemain

Sekarang alat ini di penyimpanan, bekerja pada script untuk melewati aktif player array dan memberikan setiap pengguna yang alat itu.

  1. Di PlayerManager, tambahkan variabel bernama playerWeapon untuk Senjata di ServerStorage.


    -- Variabel Peta
    local lobbySpawn = workspace.Lobby.StartSpawn
    local arenaMap = workspace.Arena
    local spawnLocations = arenaMap.SpawnLocations
    -- Variabel Pemain
    local activePlayers = {}
    local playerWeapon = ServerStorage.Weapon
  2. Di preparePlayer(), tempaste kode berikut untuk mendapatkan karakter pemain.


    local function preparePlayer(player, whichSpawn)
    player.RespawnLocation = whichSpawn
    player:LoadCharacter()
    local character = player.Character or player.CharacterAdded:Wait()
    end
  3. Buat variabel baru bernama pedang dan gunakan fungsi Clone() untuk menciptakan salinan senjata di ServerStorage. Kemudian, orangtua pedang ke karakter pemain.


    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. Uji di server lokal untuk mengkonfirmasi bahwa setiap pemain mendapatkan alat saat dikirim ke arena. Ingatlah, jika Anda terus mengujinya, istirahat akan terus dimulai dan setiap pemain akan respawn setiap beberapa detik. Ini akan diselesaikan dalam pelajaran berikutnya.

Skrip yang Diselesaikan

Di bawah ini adalah script yang selesai untuk memeriksa kembali pekerjaan Anda.

Skrip GameManager


-- Layanan
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Skrip Modul
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

Skrip MatchManager


local MatchManager = {}
-- Layanan
local ServerStorage = game:GetService("ServerStorage")
-- Skrip Modul
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
end
return MatchManager

Skrip Modul PlayerManager


local PlayerManager = {}
-- Layanan
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
-- Variabel Peta
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Variabel Pemain
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
-- Fungsi Lokal
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
-- Fungsi Modul
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
--acara
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager