เมื่อแผนที่ถูกสร้างขึ้นแล้ว ก็ถึงเวลาเริ่มสร้างสคริปต์
การติดตั้งสคริปต์
การต่อสู้จะใช้สคริปต์โมดูลและสคริปต์ปกติ ด้านล่างเป็นสคริปต์และการใช้งานของพวกเขา
GameManager | สคริปต์ ใช้งานฟังก์ชันจากผู้จัดการห้องจากการตั้งค่าเกม |
MatchManager | สคริปต์โมดูล ตรงกัน |
การตั้งค่าเกม | สคริปต์โมดูล เก็บตัวแปรที่ใช้กันอยู่ทั่วไปโดยสคริปต์อื่น |
สคริปต์ GameSettings
สร้างสคริปโมดูลที่มีชื่อว่า GameSettings เพื่อเก็บตัวแปรที่ใช้โดยสคริปต์อื่น เช่น ระยะเวลาการจับคู่และระยะเวลาการหยุดชั่วคราว ตัวแปรเหล่านี้จะถูกใช้โดยสคริปต์ GameManager ในภายหลัง
ใน ServerStorage สร้างโฟลเดอร์ที่มีชื่อว่า ModuleScripts ในโฟลเดอร์นั้น สร้างโมดูลสคริปต์ใหม่ที่มีชื่อว่า GameSettings
เปิด 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เพิ่มหน้าเมนูใหม่ที่มีชื่อว่า prepareGame() ให้คุณสมบัติการพิมพ์เพื่อทดสอบสคริปต์ในภายหลัง
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
การเขียน Game Loop
เกมหลักจะถูกเขียนในสคริปต์ GameManager โดยใช้แปรที่เพิ่งสร้างขึ้น จำไว้ว่ามีสามสถานะในเกมหลัก: พักสักครู่, การแข่งขัน, และทำความสะอาดและรีเซ็ต
สคริปต์ GameManager
สคริปต์นี้เป็นสคริปต์เซิร์ฟเวอร์ธรรมดาดังนั้นจงวางมันใน ServerScriptService แทนที่จะเป็นโฟลเดอร์โมดูล สคริปต์เกมจริงจะอยู่ในขณะที่จริงเป็นสคริปต์ที่เป็นลูป
ใน ServerScriptService สร้างสคริปต์ใหม่ที่มีชื่อว่า GameManager
เพิ่มแปรสำหรับบริการ "ServerStorage" ซึ่งเป็นที่ที่ Modulescripts ตั้งอยู่ จากนั้นเพิ่มแปรสำหรับบริการ "Players" ซึ่งจะต้องการตรวจสอบจำนวนผู้เล่นในระหว่างช่วงพัก
-- บริการlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")เพื่อใช้โมดูลที่สร้างขึ้นมาก่อนหน้านี้:
- ตั้งแป้นที่มีชื่อว่า 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 true do ใส่ชื่อ repeat และกด Enter เพื่อออโตคอมเพล็ตด้วยคีย์เวิร์ด 1> until1>
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() โดยใช้ตัวแปร transitionTime ของ GameSettings
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 โดยปกติจะอยู่ในเซิร์ฟเวอร์ของคุณด้วยผู้เล่นจำลอง
เพื่อเริ่มเซิร์ฟเวอร์ในเกมใหม่ ในแท็บ ทดสอบ > ลูกค้าและเซิร์ฟเวอร์ > ตั้งค่าผู้เล่นลงไปในตัวแปรของเกมต่ำสุดPlayers. ในบทเรียนนี้ใช้ผู้เล่น 2 คน
คลิกเริ่มเพื่อเริ่มเซิร์ฟเวอร์
รอสองสามวินาทีให้เซิร์ฟเวอร์ติดตั้งขึ้น หน้าต่างหลายอันจะเปิดขึ้นนอกจากหน้าต่างของ Studio ฉบับดั้งเดิมของคุณ คุณอาจต้องรับให้อนุญาตการเข้าถึง Roblox Studio จาก firewalls หรือซอฟต์แวร์ป้องกันออนไลน์อื่น ๆ
เคล็ดลับการแก้ปัญหา
ในขณะนี้คุณไม่สามารถดูเซิร์ฟเวอร์ทดสอบได้ ลองใช้หนึ่งในตัวเลือกต่อไปนี้
- หากคุณมีปัญหาใด ๆ กับการเริ่มต้นเซิร์ฟเวอร์ใหม่ โปรดตรวจสอบบทความ ปัญหาเกี่ยวกับเครือข่ายและเครื่องเข้าถึงอินเทอร์เน็ต
- ตั้งจำนวนผู้เล่นไว้ที่จำนวนเงินเล็กน้อย เช่น 2 หรือ 3
- หากไม่สามารถแก้ไขปัญหาได้ ลองใหม่ Studio หรือลองใหม่คอมพิวเตอร์ของคุณ
การทดสอบในเซิร์ฟเวอร์ท้องถิ่น
คุณจะเห็นหน้าต่างหลายตัวเมื่อเซิร์ฟเวอร์เริ่มขึ้น แต่ละอันเป็นตัวแทนของส่วนที่แตกต่างกันของเซิร์ฟเวอร์/ลูกค้า
- เซิร์ฟเวอร์ (ขอบสีเขียว) ที่วิ่งเกม
- ลูกค้า (ขอบสีน้ำเงิน) จำลองประสบการณ์ของผู้เล่น
เมื่อเซิร์ฟเวอร์ทำงานได้ตรวจสอบว่าโค้ดทำงานได้หรือไม่
ค้นหา หน้าต่างเซิร์ฟเวอร์ ที่มีเขตสีเขียว ตรวจสอบสถานที่พิมพ์ที่เรียกจากสคริปต์ MatchManager ด้วย เนื่องจากมีหน้าพิมพ์ซ้ำซากจำเพาะ คุณจะเห็นสถานที่พิมพ์ที่เรียกเรียนซ้ำกัน
เมื่อคุณทดสอบเสร็จสิ้นในหน้าต่างใด ๆ ให้ปิดเซิร์ฟเวอร์ด้วยปุ่ม Cleanup เมื่อปุ่มนี้ปิดเซิร์ฟเวอร์ทั้งหมดและนำคุณกลับไปที่หน้าต่างของคุณ
เคล็ดลับการแก้ปัญหา
ในขณะนี้หากคำประกาศพิมพ์ที่ตั้งใจไม่ปรากฏให้ลองใช้หนึ่งในต่อไปนี้
- ตรวจสอบว่าฟังก์ชันเช่น prepareGame() อยู่ในขอบเขตของ while ที่จริง
- หากการพิมพ์จาก 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