Manajemen pemain

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

Dengan siklus permainan dikodekan, saatnya untuk mulai menambahkan fitur ke dalamnya.Selama mencocokkan, pemain bisa datang dan pergi.Karena ini, kode diperlukan untuk tugas seperti mengirim pemain ke pertandingan dan melacak pemain aktif.Untuk mengelola tugas ini, buat skrip modul bernama PlayerManager .

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

Menyiapkan skrip

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

  1. Di ServerStorage > ModuleScripts, tambahkan skrip modul baru bernama PlayerManager.Kemudian, ganti nama tabel modul untuk cocok dengan nama skrip dan tambahkan komentar untuk fungsi lokal dan modul.


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

    Layanan:

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

    Variabel Peta dan Pemain:

    • Lobby Spawn, Arena Folder, dan Arena Spawn Folder - Digunakan untuk teleport pemain ke area yang berbeda.
    • Sebuah Array Pemain Aktif - Melacak 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 cetak uji dalam.


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

Memunculkan pemain di lobi

Saat ini, ada beberapa lokasi spawn, yang berarti pemain muncul di satu acak saat bergabung dengan game.Untuk memastikan pemain muncul di lobi, ubah properti pemain RespawnLocation.

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


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


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

Hubungkan dan uji

Sekarang modul dapat terhubung dan diuji.Dengan PlayerManager dibuat, diperlukan agar kode dalam skrip modul tersebut dapat dijalankan dan mengirim pemain ke lobi.

  1. Kembali ke Manajer Pertandingan dan buat variabel untuk hal mengikuti:

    • ServerStorage layanan.
    • ModulScripts folder, anak dari ServerStorage.
    • Skrip modul Manajer Pemain , anak dari 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 . Pastikan Anda dapat melihat hal mengikuti:

    • Semua pemain muncul di Lobi.
    • Pernyataan cetak dari PlayerManager muncul di jendela Output.
  3. Setelah selesai, klik Bersihkan untuk mematikan server.

Tip pemecahan masalah

Pada titik ini, bagian dari skrip tidak berfungsi seperti yang dimaksudkan, coba salah satu dari berikut ini.

  • Periksa nama bagian seperti Arena, atau lokasi Lobby > StartSpawn, terutama jika Anda menamakannya berbeda dari yang diinstruksikan dalam pelajaran.
  • Pastikan bahwa modul diperlukan dalam setiap skrip menggunakan fungsi require() dan diucapkan dengan benar.

Kirim pemain ke arena

Sekarang pemain muncul di lobi, teleport mereka ke pertandingan setelah jeda berakhir.Ubah lokasi bertelur pemain RespawnLocation ke lokasi arena menggunakan fungsi di objek Pemain yang disebut ReloadCharacter() .

  1. Pergi ke skrip Pengelola Pemain , di bawah onPlayerJoin(), tambahkan fungsi lokal baru bernama preparePlayer().Terdiri dari dua parameter: player dan whichSpawn, lokasi spawn untuk mengirimkannya.


    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 menjadi whichSpawn.


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


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

Kirim pemain untuk muncul

Pastikan setiap pemain diteleport ke lokasi spawn yang berbeda di arena menggunakan loop for untuk mengulangi array pemain aktif.Menggunakan loop for memungkinkan Anda untuk melalui setiap nilai dalam array pemain, memungkinkan skrip untuk disesuaikan dengan berbagai jumlah pemain.

  1. Dalam fungsi sendPlayersToMatch(), gunakan variabel untuk membuat array dari semua lokasi spawn arena dengan mendapatkan anak-anak dari folder Arena > SpawnLocations.


    --Fungsi Modul
    function PlayerManager.sendPlayersToMatch()
    local arenaSpawns = spawnLocations:GetChildren()
    end
  2. Tambahkan loop for di bawah ini untuk mendapatkan array dari semua pemain dan kemudian mengulang 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

Lacak dan hasilkan

Saat permainan berjalan, perlu mengidentifikasi pengguna mana yang bermain sehingga mereka dapat dihasilkan di arena.Pada awal ronde, setiap pemain akan dilacak dalam array pemain aktif.배열 tersebut akan digunakan untuk fungsi yang berbeda, seperti teleportasi atau menugaskan senjata, memastikan pemain yang masih di lobi selama ronde tidak terpengaruh.

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


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


    for playerKey, whichPlayer in Players:GetPlayers() do
    table.insert(activePlayers, whichPlayer)
    local spawnLocation = arenaSpawns[1]
    end
  3. Panggil preparePlayer() dan berikan di whichPlayer dan spawnLocation .Kemudian, karena lokasi spawn itu digunakan, hapus dari tabel sehingga pemain berikutnya akan mendapatkan spawn 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 pada server lokal lokal yang pemain dikirim ke arena.Pemain akan terus muncul kembali di lokasi yang sama karena kode untuk mengirim mereka kembali ke lobi belum ada.

Tip pemecahan masalah

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

  • Di GetPlayers() , pastikan ada dua tanda kurung tutup, seperti Class.Players.GetPlayers(|Players:GetPlayers()) dalam pernyataan.
  • Periksa serangkaian panggilan fungsi di skrip modul. Misalnya, matchManager.prepareGame() harus memanggil playerManager.sendPlayersToMatch() .

Memberi Pemain Senjata

Ketika ronde dimulai, setiap pemain di arena akan diberikan senjata untuk digunakan.

Tambahkan alat

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

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

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

Berikan alat ke pemain

Sekarang alat tersebut ada di penyimpanan, kerjakan skrip untuk melalui array pemain aktif dan memberikan setiap pengguna 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() , tempelkan 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 sword dan gunakan fungsi Clone() untuk membuat 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. Tes pada server lokal untuk memastikan bahwa setiap pemain mendapatkan alat saat dikirim ke arena .Ingatlah, jika Anda terus menguji, istirahat akan terus dimulai ulang dan pemain akan respawn setiap beberapa detik.Ini akan diselesaikan di pelajaran berikutnya.

Skrip selesai

Di bawah ini adalah skrip yang selesai untuk memeriksa ulang pekerjaan Anda.

Skrip Manajer Game


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


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


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
--peristiwa
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager