เมื่อสร้างแผนที่แล้ว ถึงเวลาที่จะเริ่มสร้างสคริปต์ส่วนที่เหลือของหลักสูตรนี้จะมุ่งเน้นไปที่การเขียนสคริปต์ทั้งหมดขององค์ประกอบที่แตกต่างกันของลูปเกม
ตั้งค่าสคริปต์
การต่อสู้รอยัลจะใช้การผสมผสานของสคริปต์โมดูลและสคริปต์ปกติ ด้านล่างนี้เป็นสคริปต์และฟังก์ชันของพวกเขา
ผู้จัดการเกม | สคริปต์ ทำงานฟังก์ชันจากผู้จัดการการจับคู่โดยใช้ตัวแปรจากการตั้งค่าเกม |
ผู้จัดการการจับคู่ | สคริปต์โมดูล ตรงกัน |
การตั้งค่าเกม | สคริปต์โมดูล เก็บตัวแปรทั่วไปที่ใช้โดยสคริปต์อื่น |
สคริปต์ GameSettings
สร้างสคริปต์โมดูลชื่อ GameSettings เพื่อเก็บตัวแปรที่ใช้โดยสคริปต์อื่นๆ เช่น ระยะเวลาการแข่งขันและช่วงพักตัวแปรเหล่านี้จะถูกใช้โดยสคริปต์ GameManager ในภายหลัง
ใน ServerStorage สร้างโฟลเดอร์ชื่อ ModuleScripts ในโฟลเดอร์นั้นสร้างสคริปต์โมดูลใหม่ชื่อ GameSettings
เปิดการตั้งค่าเกมและเปลี่ยนชื่อตารางโมดูลให้ตรงกับชื่อสคริปต์
local GameSettings = {}return GameSettingsในตารางโมดูล เพิ่มตัวแปรสำหรับการใช้งานต่อไปนี้ ใช้ความคิดเห็นที่ดีที่สุดสำหรับแต่ละค่า คุณสามารถเปลี่ยนได้ในภายหลังเมื่อคุณทดสอบ
- ระยะเวลาช่วงพัก - ตรงกัน
- ระยะเวลาการจับคู่ - ความยาวของการจับคู่ในวินาที
- ผู้เล่นขั้นต่ำ - จำนวนผู้เล่นน้อยที่สุดที่จำเป็นต้องเริ่มต้น
- เวลาเปลี่ยนผ่าน - เวลาก่อนและหลังการแข่งขันในวินาที ทำให้การเปลี่ยนผ่านระหว่างส่วนต่างๆของลูปเกมน้อยลงอย่างกะทันหัน
local GameSettings = {}-- ตัวแปรเกมGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
สคริปต์ MatchManager
สคริปต์ที่สองที่เชื่อมต่อกับ GameManager คือ MatchManagerสคริปต์นี้จัดการงานเช่นเริ่มตัวจับเวลาหรือรีเซ็ตผู้เล่นเมื่อการแข่งขันสิ้นสุด
ภายใน MatchManager มีฟังก์ชันชื่อ prepareGame() ตรงกัน
ใน ServerStorage > ModuleScripts > เพิ่มสคริปต์โมดูลชื่อ MatchManager เปลี่ยนชื่อตารางโมดูล
local MatchManager = {}return MatchManagerเพิ่มฟังก์ชันโมดูลใหม่ให้กับ MatchManager ชื่อ prepareGame() รวมถึงคำสั่งพิมพ์เพื่อทดสอบสคริปต์ในภายหลัง
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
เขียนลูปเกม
ลูปเกมหลักจะถูกเขียนในสคริปต์ GameManager โดยใช้ตัวแปรที่เพิ่งสร้างขึ้นจำไว้ว่ามีสามขั้นตอนในวงจรเกม: ช่วงพักกิจกรรม, การแข่งขัน, และการล้างและรีเซ็ต
สคริปต์ GameManager
สคริปต์นี้เป็นสคริปต์เซิร์ฟเวอร์ปกติดังนั้นใส่ลงใน ServerScriptService แทนที่จะเป็นโฟลเดอร์สคริปต์โมดูลลูปเกมจริงจะอยู่ในลูป while true do ชั่วคราว
ใน ServerScriptService สร้างสคริปต์ใหม่ชื่อ GameManager
เพิ่มตัวแปรสำหรับบริการ "ServerStorage" ซึ่งเป็นที่ที่ Modulescripts อยู่จากนั้นเพิ่มตัวแปรสำหรับบริการ "ผู้เล่น" ซึ่งจะต้องใช้เพื่อตรวจสอบจํานวนผู้เล่นในระหว่างช่วงพัก
-- บริการlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")เพื่อใช้โมดูลที่สร้างไว้ล่วงหน้า:
- ตั้งแปรชื่อ moduleScripts ไปยังตำแหน่งของโฟลเดอร์ ModuleScripts
- เพิ่มตัวแปรที่ชื่อ matchManager และ gameSettings กำหนดให้แต่ละตัวแปรต้องใช้สคริปต์ตามลำดับ
-- บริการlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- สคริปต์โมดูลlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))หลังจากแปรแล้วเพิ่มลูป while true do ลูปทั้งหมดของเกมลูปจะไปภายในเพื่อทำซ้ำอย่างไม่มีกำหนด
-- สคริปต์โมดูลlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- ลูปเกมหลักwhile true doend
บันทึกช่วงระยะหยุด
ในขณะที่วงล้อเกมทำงานได้ตลอดไป ช่วงระยะหยุดควรหยุดวงล้อและเพียงดำเนินการต่อเมื่อมีผู้เล่นเพียงพอสำหรับการแข่งขันเพื่อโค้ดการหยุดชั่วคราวนี้ รวมลูปซ้ำที่ซ้อนกันสำหรับช่วงพักในลูป whileลูปซ้อนที่จะทำซ้ำจนกว่าจะมีผู้เล่นเพียงพอ หยุดลูปหลักเมื่อมีผู้เล่นเพียงพอแล้ว ตรงกัน
ด้วยลูปซ้ำ **** รหัสในลูปจะทำงานอย่างน้อยหนึ่งครั้งไม่เหมือนกับลูป while ตรงกัน
ในลูป while true do ให้พิมพ์ repeat และกด Enter เพื่อเสร็จสิ้นด้วยคีย์เวิร์ด until
while true dorepeatuntilendตรวจสอบว่าจํานวนผู้เล่นปัจจุบัน (#Players:GetPlayers()) มากกว่าหรือเท่ากับตัวแปร minimumPlayers ที่สร้างไว้ก่อนในโมดูล GameSettings
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendในลูปซ้ำเพิ่มคำสั่งพิมพ์ที่ระบุว่าช่วงระยะหยุดกำลังเริ่มใช้ task.wait() เพื่อหยุดชั่วคราวระหว่างช่วงพักโดยใช้ intermissionDuration จาก GameSettings
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendทดสอบและตรวจสอบว่าคำสั่งพิมพ์ "Starting intermission" จะแสดงอย่างน้อยสองครั้งการเห็นข้อความสองครั้งพิสูจน์ว่าลูปซ้ำไม่พบผู้เล่นเพียงพอและทำงานอีกครั้งคุณจะต้องรอระยะเวลาระหว่างการรอก่อนที่จะเห็นข้อความเป็นครั้งที่สอง
เคล็ดลับการแก้ปัญหา
ในจุดนี้ หากคุณไม่ได้เกิดขึ้นตามที่ตั้งใจไว้ ลองหนึ่งในสิ่งต่อไปนี้
- task.wait() ควรอยู่ภายในลูปซ้ำโดยไม่ต้องรอ สคริปต์จะทำงานหลายครั้งในหนึ่งวินาที ทำให้ Roblox Studio เต็มและทําให้เกิดข้อผิดพลาด
- ในโมดูลการตั้งค่าเกม ตัวแปร intermissionDuration ควรมากกว่า 1 หากต่ำกว่า สคริปต์จะสามารถทำซ้ำบ่อยเกินไปทำให้เกิดปัญหาช้าลง
สิ้นสุดการหยุดชะงัก
เมื่อมีผู้เล่นเพียงพอแล้ว ให้พวกเขารอเวลาเปลี่ยนผ่านสั้น ๆจากนั้นส่งพวกเขาไปยังการแข่งขันโดยโทรไปที่ฟังก์ชัน prepareGame() ใน MatchManagerจำไว้ว่าฟังก์ชันนี้เพียงแค่พิมพ์บรรทัด แต่คุณจะเพิ่มโค้ดเพิ่มเติมในภายหลัง
เมื่อสิ้นสุดลูปซ้ำให้เพิ่มคำสั่งพิมพ์ที่ระบุว่าช่วงพักสิ้นสุดแล้วเพื่อทดสอบโค้ดของคุณจากนั้นให้ทำตามด้วยตัวแปร task.wait() ของ GameSetting's transitionTime โดยใช้
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endหลังจากรอ โทรไปที่ prepareGame() จากโมดูล MatchManagerเมื่อรหัสทำงานแล้ว จะพิมพ์ข้อความลงในหน้าต่างเอาต์พุตเท่านั้นรอจนถึงส่วนถัดไปเพื่อทดสอบรหัสนี้
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
ทดสอบเกมผู้เล่นหลายคน
ตอนนี้, เพื่อให้โค้ดทำงาน prepareGame() , ต้องออกจากลูปซ้ำแต่เพื่อที่จะทำเช่นนั้นจำเป็นต้องมีผู้เล่นมากกว่าหนึ่งคนซึ่งหมายความว่าหากคุณใช้ปุ่มเล่นทดสอบฟังก์ชันจะไม่ทำงานเพราะคุณเป็นผู้เล่นเพียงคนเดียวในเกม (เว้นแต่ผู้เล่นขั้นต่ำของคุณเป็นหนึ่ง)เพื่อทดสอบสิ่งนี้คุณจะต้องจำลองเกมผู้เล่นหลายคน
เริ่มเซิร์ฟเวอร์ท้องถิ่น
เพื่อทดสอบโค้ดที่ต้องการผู้เล่นมากกว่าหนึ่งคน สร้างเซิร์ฟเวอร์ท้องถิ่นในขณะที่เกมที่เผยแพร่มักจะอยู่บนเซิร์ฟเวอร์ Roblox แต่ เซิร์ฟเวอร์ท้องถิ่น จะจำลองเกมผู้เล่นหลายคนบนคอมพิวเตอร์ของคุณด้วยผู้เล่นจำลอง
เพื่อเริ่มต้นเซิร์ฟเวอร์ท้องถิ่นในแท็บ ทดสอบ > ไคลเอนต์และเซิร์ฟเวอร์ ส่วน > ตั้งการดรอปดาวน์ของผู้เล่นให้เป็นจํานวนผู้เล่นที่น้อยที่สุดในแปรของ GameSetting's variable minimumPlayersบทเรียนนี้ใช้ผู้เล่น 2 คน
คลิกเริ่มเพื่อเริ่มต้นเซิร์ฟเวอร์
รอไม่กี่วินาทีให้เซิร์ฟเวอร์ตั้งค่าหน้าต่างหลายบานจะเปิดขึ้นเพิ่มเติมจากหน้าต่าง Studio เดิมคุณอาจต้องอนุญาตการเข้าถึง Roblox Studio จากไฟร์วอลล์หรือซอฟต์แวร์รักษาความปลอดภัยออนไลน์อื่นๆ
เคล็ดลับการแก้ปัญหา
ในจุดนี้คุณไม่สามารถเห็นเซิร์ฟเวอร์ทดสอบได้ ลองหนึ่งในสิ่งต่อไปนี้
- หากคุณมีปัญหาใดๆ กับการเริ่มต้นของเซิร์ฟเวอร์ให้ตรวจสอบบทความ ปัญหาเกี่ยวกับไฟร์วอลล์และเราเตอร์ อีกครั้ง
- ตั้งจำนวนผู้เล่นเป็นจำนวนเล็กน้อย เช่น 2 หรือ 3
- หากปัญหายังไม่ได้รับการแก้ไข ลองรีสตาร์ท Studio หรือรีสตาร์ทคอมพิวเตอร์ของคุณ
ทดสอบในเซิร์ฟเวอร์ท้องถิ่น
คุณจะเห็นหน้าต่างหลายบานเมื่อเซิร์ฟเวอร์เริ่มต้น แต่ละหน้าต่างแทนที่ตัวแทนส่วนต่างๆ ของเซิร์ฟเวอร์/คลายเซิร์ฟเวอร์
- เซิร์ฟเวอร์ (ขอบสีเขียว) เรียกเกม
- ไคลเอนต์ (ขอบสีฟ้า) จำลองประสบการณ์ของผู้เล่น


เมื่อเซิร์ฟเวอร์ทำงานแล้ว คุณสามารถตรวจสอบได้ว่าโค้ดทำงานได้หรือไม่
ค้นหาหน้าต่าง เซิร์ฟเวอร์ ที่มีขอบสีเขียวตรวจสอบสำหรับคำสั่งพิมพ์ที่เรียกจากสคริปต์ MatchManagerเนื่องจากมีลูปซ้ำ คุณจะเห็นคำสั่งพิมพ์เดียวกันซ้ำ
เมื่อคุณทดสอบเสร็จแล้ว ในหน้าต่างใดก็ได้ ปิดเซิร์ฟเวอร์โดยใช้ปุ่มล้างการดำเนินการนี้จะปิดหน้าต่างเซิร์ฟเวอร์และไคลเอนต์ทั้งหมดและนำคุณกลับไปที่หน้าต่างสตูดิโอปกติ
เคล็ดลับการแก้ปัญหา
ในจุดนี้หากคำสั่งพิมพ์ที่ตั้งใจไว้ไม่ปรากฏขึ้น ลองหนึ่งในสิ่งต่อไปนี้
- ตรวจสอบว่าฟังก์ชันเช่น prepareGame() อยู่ในขอบเขตของลูป while true
- หากการพิมพ์จาก MatchManager ไม่ทำงาน ตรวจสอบปัญหาทั่วไปในการแก้ไขด้วยสคริปต์โมดูล เช่น ตรวจสอบให้แน่ใจว่าสคริปต์ MatchManager จำเป็นใน GameManager หรือว่า prepareGame() ถูกเพิ่มลงในตารางของโมดูลนั้น
สคริปต์สําเร็จ
ด้านล่างเป็นสคริปต์ที่เสร็จสมบูรณ์เพื่อตรวจสอบงานของคุณอีกครั้ง
สคริปต์ GameManager
-- บริการlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- สคริปต์โมดูลlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- ลูปเกมหลักwhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
สคริปต์ MatchManager
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
สคริปต์ GameSettings
local GameSettings = {}-- ตัวแปรเกมGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings