การเขียน Game Loop

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

เมื่อแผนที่ถูกสร้างขึ้นแล้ว ก็ถึงเวลาเริ่มสร้างสคริปต์

การติดตั้งสคริปต์

การต่อสู้จะใช้สคริปต์โมดูลและสคริปต์ปกติ ด้านล่างเป็นสคริปต์และการใช้งานของพวกเขา

GameManagerสคริปต์ ใช้งานฟังก์ชันจากผู้จัดการห้องจากการตั้งค่าเกม
MatchManagerสคริปต์โมดูล ตรงกัน
การตั้งค่าเกมสคริปต์โมดูล เก็บตัวแปรที่ใช้กันอยู่ทั่วไปโดยสคริปต์อื่น

สคริปต์ GameSettings

สร้างสคริปโมดูลที่มีชื่อว่า GameSettings เพื่อเก็บตัวแปรที่ใช้โดยสคริปต์อื่น เช่น ระยะเวลาการจับคู่และระยะเวลาการหยุดชั่วคราว ตัวแปรเหล่านี้จะถูกใช้โดยสคริปต์ GameManager ในภายหลัง

  1. ใน ServerStorage สร้างโฟลเดอร์ที่มีชื่อว่า ModuleScripts ในโฟลเดอร์นั้น สร้างโมดูลสคริปต์ใหม่ที่มีชื่อว่า GameSettings

  2. เปิด GameSettings และเปลี่ยนชื่อโมดูลให้ตรงกับชื่อของสคริป


    local GameSettings = {}
    return GameSettings
  3. ในตารางโมดูล เพิ่มตัวแปรสำหรับการใช้งานต่อไปนี้ ใช้คำเดาที่ดีที่สุดสำหรับแต่ละมูลค่า คุณสามารถเปลี่ยนได้ในภายหลังเมื่อคุณทดสอบ

    • ระยะเวลาการหยุดชั่วคราว - ตรงกัน
    • ระยะเวลาการจับคู่ - ความยาวของการจับคู่ในวินาที
    • ผู้เล่นอย่างน้อย - จำนวนผู้เล่นที่ต้องการน้อยที่สุดที่จะเริ่มต้น
    • เวลาในการเปลี่ยนแปลง - เวลาก่อนและหลังการแข่งขันในวินาที ทำให้การเปลี่ยนแปลงระหว่างส่วนต่างๆ ของเกมน้อยลง

    local GameSettings = {}
    -- แปรแกม
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

สคริปต์ MatchManager

สคริปต์ที่สองที่เชื่อมต่อกับ GameManager คือ MatchManager สคริปต์นี้จัดการงานเช่นการเริ่มตัวนับเวลาหรือการรีเซ็ตผู้เล่นเมื่อจบการแข่งขัน

ภายใน MatchManager มีฟังก์ชันที่มีชื่อว่า prepareGame() ตรงกัน

  1. ใน ServerStorage > ModuleScripts > เพิ่มสคริปต์โมดูลที่มีชื่อว่า MatchManager รีเนมโครงสร้างโมดูล


    local MatchManager = {}
    return MatchManager
  2. เพิ่มหน้าเมนูใหม่ที่มีชื่อว่า prepareGame() ให้คุณสมบัติการพิมพ์เพื่อทดสอบสคริปต์ในภายหลัง


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

การเขียน Game Loop

เกมหลักจะถูกเขียนในสคริปต์ GameManager โดยใช้แปรที่เพิ่งสร้างขึ้น จำไว้ว่ามีสามสถานะในเกมหลัก: พักสักครู่, การแข่งขัน, และทำความสะอาดและรีเซ็ต

สคริปต์ GameManager

สคริปต์นี้เป็นสคริปต์เซิร์ฟเวอร์ธรรมดาดังนั้นจงวางมันใน ServerScriptService แทนที่จะเป็นโฟลเดอร์โมดูล สคริปต์เกมจริงจะอยู่ในขณะที่จริงเป็นสคริปต์ที่เป็นลูป

  1. ใน ServerScriptService สร้างสคริปต์ใหม่ที่มีชื่อว่า GameManager

  2. เพิ่มแปรสำหรับบริการ "ServerStorage" ซึ่งเป็นที่ที่ Modulescripts ตั้งอยู่ จากนั้นเพิ่มแปรสำหรับบริการ "Players" ซึ่งจะต้องการตรวจสอบจำนวนผู้เล่นในระหว่างช่วงพัก


    -- บริการ
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. เพื่อใช้โมดูลที่สร้างขึ้นมาก่อนหน้านี้:

    • ตั้งแป้นที่มีชื่อว่า 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"))
  4. หลังตัวแปรให้เพิ่ม while true do ลูป พันธสีของเกมจะไปทั้งหมดในเวลาไม่อันตรากตรำ เพื่อที่จะทำซ้ำได้อย่างไม่มีที่สิ้นสุด


    -- สคริปโมดูล
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- ห่วงเกมหลัก
    while true do
    end

การเขียนช่วงพัก

ขณะที่เกมนี้จะทำงานตลอดไป, ช่วงพักควรหยุดวงล้อและเริ่มต้นเกมเฉพาะเมื่อมีผู้เล่นเพียงพอสำหรับการแข่งขัน เพื่อให้โค้ดช่วงพักนี้, ใส่ซ้ำวงล้อสำหรับช่วงพ

ด้วย เเบบที่ซ้ำซากซ้ำซาก ในรอบนี้, โค้ดในรอบนี้จะดำเนินการอย่างน้อยหนึ่งครั้ง ในขณะที่เเบบที่ซ้ำซากซ้ำซากไม่ได้ตรวจสอบว่ามันเป็นเงื่อนไขจนกว่าจะสิ้นสุดรอบ

  1. ในลูป while true do ใส่ชื่อ repeat และกด Enter เพื่อออโตคอมเพล็ตด้วยคีย์เวิร์ด 1> until1>


    while true do
    repeat
    until
    end
  2. ตรวจสอบว่าจำนวนผู้เล่นปัจจุบัน (#Players:GetPlayers()) ใหญ่กว่าหรือเท่ากับตัวแปร minimumPlayers ที่สร้างขึ้นก่อนหน้าในโมดูล GameSettings


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. ในลำดับที่ซ้ำกัน ใส่คำพิมพ์ที่พูดว่าช่วงพักกำลังเริ่ม ใช้ task.wait() เพื่อหยุดชั่วคราวในช่วงพักโดยใช้ intermissionDuration จาก GameSettings


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. ทดสอบและตรวจสอบว่าประกาศการพิมพ์ "Starting intermission" ปรากฏขึ้นอย่างน้อยสองครั้ต่อให้เห็น การดูข้อความสองครั้งช่วยให้เห็นว่าห่วงโซ่ที่ซ้ำซากไม่พบผู้เล่นเพียงคนเด

เคล็ดลับการแก้ปัญหา

ในขณะนี้หากคุณไม่ได้สร้างตามที่คุณตั้งใจไว้ ลองใช้หนึ่งในต่อไปนี้

  • task.wait() ควรอยู่ในลำดับที่ซ้ำกัน โดยไม่ต้องรอคอย สคริปต์จะดำเนินการมากเกินไปในแต่ละวินาทีโดยการโหลด Roblox Studio เกินไปและสาเหตุผิดพลาด
  • ในโมดูลการตั้งค่าเกม ตัวแปร intermissionDuration ควรใหญ่กว่า 1 หากต่ำกว่านั้น สคริปต์สามารถทำซ้ำได้บ่อยเกินไปส่งผลให้เกิดปัญหาช้า

การสิ้นสุดการหยุดชั่วคราว

เมื่อมีผู้เล่นเพียงพอแล้วให้พวกเขารอเวลาของการเปลี่ยนแปลงสั้น ๆ แล้วส่งพวกเขาเข้าสู่การแข่งขันโดยการเรียกใช้ prepareGame() ใน MatchManager จำไว้ว่าสัญลักษณ์นี้เพียงแค่พิมพ์ตัวอักษรเดีย

  1. ในตอนท้ายของวงจรที่ซ้ำกันเพิ่มคำพิมพ์ที่พูดว่าช่วงพักจบลงเพื่อทดสอบรหัสของคุณ จากนั้นให้ติดตามด้วย task.wait() โดยใช้ตัวแปร transitionTime ของ GameSettings


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. หลังจากรอคอย โทร prepareGame() จากโมดูล MatchManager เมื่อโค้ดทำงานแล้วจะเพียงพิมพ์ข้อความเป็นตัวอักษรไปยังหน้าต่างการพิมพ์ รอจนกว่าจะมีส่วนต่อไปในการทดสอบรหัสนี้


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

การทดสอบเกมผู้เล่นหลาย

ตอนนี้, เพื่อให้โค้ดวิ่ง prepareGame() , ต้องออกจากวงล้อซ้ำ. แต่, เพื่อทำเช่นนั้น, เกมนี่หมายถึง, หากคุณใช้ปุ่ม

เริ่มเซิร์ฟเวอร์ในเครื่อง

เพื่อทดสอบรหัสที่ต้องการผู้เล่นมากกว่าหนึ่งคนโดยสร้างเซิร์ฟเวอร์ท้องถิ่น ในขณะที่เกมที่เผยแพร่บนเซิร์ฟเวอร์ Roblox โดยปกติจะอยู่ในเซิร์ฟเวอร์ของคุณด้วยผู้เล่นจำลอง

  1. เพื่อเริ่มเซิร์ฟเวอร์ในเกมใหม่ ในแท็บ ทดสอบ > ลูกค้าและเซิร์ฟเวอร์ > ตั้งค่าผู้เล่นลงไปในตัวแปรของเกมต่ำสุดPlayers. ในบทเรียนนี้ใช้ผู้เล่น 2 คน

  2. คลิกเริ่มเพื่อเริ่มเซิร์ฟเวอร์

  3. รอสองสามวินาทีให้เซิร์ฟเวอร์ติดตั้งขึ้น หน้าต่างหลายอันจะเปิดขึ้นนอกจากหน้าต่างของ Studio ฉบับดั้งเดิมของคุณ คุณอาจต้องรับให้อนุญาตการเข้าถึง Roblox Studio จาก firewalls หรือซอฟต์แวร์ป้องกันออนไลน์อื่น ๆ

เคล็ดลับการแก้ปัญหา

ในขณะนี้คุณไม่สามารถดูเซิร์ฟเวอร์ทดสอบได้ ลองใช้หนึ่งในตัวเลือกต่อไปนี้

การทดสอบในเซิร์ฟเวอร์ท้องถิ่น

คุณจะเห็นหน้าต่างหลายตัวเมื่อเซิร์ฟเวอร์เริ่มขึ้น แต่ละอันเป็นตัวแทนของส่วนที่แตกต่างกันของเซิร์ฟเวอร์/ลูกค้า

  • เซิร์ฟเวอร์ (ขอบสีเขียว) ที่วิ่งเกม
  • ลูกค้า (ขอบสีน้ำเงิน) จำลองประสบการณ์ของผู้เล่น
เซิร์ฟเวอร์ที่มีขอบสีเขียว
ลูกค้าที่มีขอบสีน้ำเงิน

เมื่อเซิร์ฟเวอร์ทำงานได้ตรวจสอบว่าโค้ดทำงานได้หรือไม่

  1. ค้นหา หน้าต่างเซิร์ฟเวอร์ ที่มีเขตสีเขียว ตรวจสอบสถานที่พิมพ์ที่เรียกจากสคริปต์ MatchManager ด้วย เนื่องจากมีหน้าพิมพ์ซ้ำซากจำเพาะ คุณจะเห็นสถานที่พิมพ์ที่เรียกเรียนซ้ำกัน

  2. เมื่อคุณทดสอบเสร็จสิ้นในหน้าต่างใด ๆ ให้ปิดเซิร์ฟเวอร์ด้วยปุ่ม 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 do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("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 = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings