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.
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 Modulreturn PlayerManagerTambahkan 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 = {}-- Layananlocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- Variabel Petalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Variabel Pemainlocal activePlayers = {}-- Fungsi Lokal-- Fungsi Modulreturn PlayerManagerBuat fungsi modul bernama sendPlayersToMatch() dengan cetak uji dalam.
-- Fungsi Lokal-- Fungsi Modulfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn 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.
Buat fungsi lokal baru bernama onPlayerJoin() dengan parameter player .Dalam fungsi itu, atur lokasi respawn pemain ke variabel spawn lobi yang dibuat sebelumnya.
-- Fungsi Lokallocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendTambahkan bagian acara di bawah fungsi modul Anda. Kemudian, hubungkan onPlayerJoin() ke acara PlayerAdded dari Layanan Pemain.
-- Fungsi Modulfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- PeristiwaPlayers.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.
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 = {}-- Layananlocal ServerStorage = game:GetService("ServerStorage")-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))function MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerGunakan 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.
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() .
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 Lokallocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendlocal function preparePlayer(player, whichSpawn)end-- Fungsi Modulfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endTetapkan lokasi respawn pemain menjadi whichSpawn.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendPaksa karakter untuk memuat ulang, menggunakan LoadCharacter() , dan pemain akan respawn menggunakan lokasi yang baru ditugaskan kepada mereka.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer: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.
Dalam fungsi sendPlayersToMatch(), gunakan variabel untuk membuat array dari semua lokasi spawn arena dengan mendapatkan anak-anak dari folder Arena > SpawnLocations.
--Fungsi Modulfunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endTambahkan 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() doendend
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.
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() dotable.insert(activePlayers, whichPlayer)endendUntuk mendapatkan lokasi spawn dari arena, buat variabel bernama dan atur ke indeks pertama di tabel .
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endPanggil 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endTes 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.
Impor senjata dari Toolbox, atau buat sendiri (lihat Tools ).
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.
Di PlayerManager, tambahkan variabel bernama playerWeapon untuk Senjata di ServerStorage.
-- Variabel Petalocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Variabel Pemainlocal activePlayers = {}local playerWeapon = ServerStorage.WeaponDi preparePlayer() , tempelkan kode berikut untuk mendapatkan karakter pemain.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()endBuat 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 = whichSpawnplayer:LoadCharacter()local character = player.Character or player.CharacterAdded:Wait()local sword = playerWeapon:Clone()sword.Parent = characterendTes 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
-- Layananlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skrip Modullocal 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
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