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.
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 Modulreturn PlayerManagerTambahkan 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 = {}-- 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 cetakan ulang pengujian di dalam.
-- Fungsi Lokal-- Fungsi Modulfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")endreturn 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.
Buat fungsi lokal baru bernama onPlayerJoin() dengan parameter player . Di fungsi itu, atur lokasi respawn pemain ke variabel respawn lobi yang dibuat sebelumnya.
-- Fungsi Lokallocal function onPlayerJoin(player)player.RespawnLocation = lobbySpawnendTambahkan seksi acara di bawah fungsi modul Anda. Kemudian, hubungkan onPlayerJoin() ke acara PlayerAdded di layanan Pemain.
-- Fungsi Modulfunction PlayerManager.sendPlayersToMatch()print("Sending players to match")end-- AcaraPlayers.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.
Kembali ke MatchManager dan buat variabel untuk mengikuti:
- layanan ServerStorage.
- ModuleScripts folder, anak ServerStorage.
- PlayerManager naskah modul, anak 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. Konfirmasi bahwa Anda dapat melihat mengikuti:
- Semua pemain muncul di Lobi.
- Pernyataan cetak dari PlayerManager muncul di Jendela Keluaran.
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() .
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 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 ke whichSpawn .
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnendMengikuti karakter untuk memuat ulang, menggunakan LoadCharacter() , dan pemain akan respawn menggunakan lokasi baru yang baru ditetapkan.
local function preparePlayer(player, whichSpawn)player.RespawnLocation = whichSpawnplayer: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
Dalam fungsi sendPlayersToMatch(), gunakan variabel untuk menciptakan array dari semua lokasi bertelur di arena dengan mengambil anak-anak dari folder Arena > SpawnLocations.
--Fungsi Modulfunction PlayerManager.sendPlayersToMatch()local arenaSpawns = spawnLocations:GetChildren()endTambahkan 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() doendend
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.
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() dotable.insert(activePlayers, whichPlayer)endendUntuk mendapatkan lokasi bertelur dari arena, buat variabel bernama spawnLocation dan tetapkan ke pertama indeks di tabel arenaSpawns.
for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = arenaSpawns[1]endPanggil 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() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(arenaSpawns, 1)preparePlayer(whichPlayer, spawnLocation)endTes 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.
Impor senjata dari Toolbox, atau buat sendiri (lihat Tools).
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.
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(), tempaste 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 pedang dan gunakan fungsi Clone() untuk menciptakan 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 = characterendUji 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
-- 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 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