เมื่อโครงการมีความซับซ้อนมากขึ้น การคิดเกี่ยวกับการจัดระเบียบสคริปต์จึงมีความสำคัญ การปฏิบัติในการจัดระเบียบที่ดีสามารถช่วยให้แน่ใจว่าโค้ดจะไม่ถูกทำซ้ำระหว่างสคริปต์ หรือกลายเป็นสิ่งที่จัดการได้ยาก
วิธีที่ดีกว่าในการจัดระเบียบและนำโค้ดกลับมาใช้ใหม่คือการใช้ โมดูลสคริปต์ ซึ่งเป็นประเภทสคริปต์ที่ไม่เหมือนใครที่เก็บชุดฟังก์ชันและตัวแปรที่ออกแบบมาเพื่อตอบสนองวัตถุประสงค์ร่วมกัน เช่น การจัดการเงินของผู้เล่นหรือศัตรู โค้ดภายในโมดูลสคริปต์สามารถถูกใช้โดยสคริปต์อื่นได้ ด้วยวิธีนี้ คุณสามารถเรียกใช้ฟังก์ชันเดียวกันที่ให้เหรียญจากสคริปต์ที่แตกต่างกันหลายตัวเมื่อผู้เล่นทำภารกิจเสร็จหรือพบของสะสม
โดยการเก็บโค้ดที่ใช้บ่อยในโมดูลสคริปต์ จะทำให้การบำรุงรักษาและการจัดระเบียบโค้ดง่ายขึ้น เนื่องจากการเปลี่ยนแปลงเพียงแค่ต้องทำในโมดูลสคริปต์เดียว แทนที่จะต้องอัปเดตหลายสคริปต์
พื้นฐานของโมดูลสคริปต์
โมดูลสคริปต์เป็นวัตถุแยกต่างหากเมื่อเปรียบเทียบกับวัตถุสคริปต์ ใน Roblox โมดูลสคริปต์สามารถระบุได้ด้วยไอคอน สีม่วง
สร้างโมดูลสคริปต์
โมดูลสคริปต์มักจะถูกวางใน ServerScriptService เมื่อใช้โดยสคริปต์ฝั่งเซิร์ฟเวอร์ และ ReplicatedStorage เมื่อใช้โดยสคริปต์ท้องถิ่นฝั่งไคลเอนต์ (เช่น การโต้ตอบ GUI)
- สร้าง ModuleScript ใน ServerScriptService.

โครงสร้างของโมดูลสคริปต์
เมื่อสร้างขึ้น โมดูลสคริปต์แต่ละตัวจะเริ่มต้นด้วยโค้ดด้านล่าง:
local Module = {}
return Moduleบรรทัด local Module = {} สร้างตารางหรือภาชนะของโค้ด ซึ่งฟังก์ชันและตัวแปรที่ใช้ร่วมกันของโมดูลสามารถถูกเก็บไว้ ตารางนี้ควรถูกเปลี่ยนชื่อให้ตรงกับวัตถุประสงค์ของโมดูล เช่น RewardManager หรือ ParticleController ในขณะที่ตัวแปรอื่น ๆ จะใช้ camel case (myVariable) ตารางโมดูลแนะนำให้ใช้ pascal case และเริ่มต้นด้วยตัวพิมพ์ใหญ่ (MyModule)
local RewardManager = {}
return RewardManagerเพื่อให้สคริปต์อื่นสามารถใช้ฟังก์ชันหรือค่าตัวแปรที่ไม่เป็นท้องถิ่นของโมดูลได้ โมดูลแต่ละตัวจะสิ้นสุดด้วยการคืนค่า MyModule ทุกครั้งที่สคริปต์อื่นพยายามเข้าถึงโค้ดจากโมดูล การคืนค่าจะทำให้สคริปต์นั้นเข้าถึงโค้ดที่เก็บอยู่ในตารางโมดูล
เพิ่มไปยังโมดูลสคริปต์
เพื่อเพิ่มฟังก์ชันหรือตัวแปรไปยังโมดูลซึ่งสามารถใช้ในสคริปต์อื่นได้ ให้พิมพ์ชื่อของตารางโมดูล ตามด้วยจุด และชื่อของฟังก์ชันหรือตัวแปร เช่นใน TestModule.myVariable การใช้ตัวดำเนินการจุดเป็นอีกวิธีหนึ่งในการเพิ่มโค้ดลงในตาราง ทำให้สคริปต์อื่นสามารถเข้าถึงโค้ดนั้นได้เมื่อใดก็ตามที่ตารางโมดูลถูกคืนค่า
local TestModule = {}
-- เพิ่มตัวแปรไปยังตาราง 'TestModule'
TestModule.myVariable = 100
-- เพิ่มฟังก์ชันไปยังตาราง 'TestModule'
function TestModule.doTask(player)
-- โค้ดตัวอย่าง
end
return TestModuleขอบเขตในโมดูลสคริปต์
เพื่อให้ฟังก์ชันหรือตัวแปรของโมดูลสามารถใช้ในสคริปต์ภายนอกได้ อย่า พิมพ์ local
การพิมพ์ local ข้างหน้าตัวแปรและฟังก์ชันหมายความว่าพวกเขา สามารถใช้ได้เฉพาะ โดยสคริปต์นั้น ๆ ในขณะที่นี่เป็นแนวทางปฏิบัติที่ดีสำหรับสคริปต์ส่วนใหญ่เพื่อลดข้อผิดพลาดและการแก้ไขปัญหา คุณไม่สามารถทำให้ฟังก์ชันและตัวแปรของโมดูลเป็นท้องถิ่นได้
โค้ดใด ๆ ที่ใช้ เฉพาะ โดยโมดูลสคริปต์นั้นควรยังคงรวม local ไว้ ตัวอย่างเช่น โค้ดด้านล่างรวมตัวแปรท้องถิ่น difficultyModifier ซึ่งสามารถใช้ได้เฉพาะในโมดูลสคริปต์นั้น และฟังก์ชัน getCoinReward() ซึ่งสามารถใช้ในสคริปต์ภายนอกโมดูล
local RewardManager = {}
-- ใช้ได้เฉพาะในโมดูลสคริปต์
local rewardCoins = 50
-- ใช้ได้เฉพาะในโมดูลสคริปต์
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- ใช้ได้ในสคริปต์อื่น
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManagerใช้โมดูลในสคริปต์อื่น
โดยตัวมันเอง โมดูลสคริปต์ไม่สามารถรันโค้ดได้ — มันต้องถูกโหลดในสคริปต์อื่นโดยใช้คีย์เวิร์ด require() ฟังก์ชัน require() รับพารามิเตอร์หนึ่งตัว คือที่ตั้งของโมดูลสคริปต์ใน Explorer
ในการใช้โมดูล ในสคริปต์แยกต่างหาก ให้ตั้งค่าตัวแปรให้เท่ากับ require(moduleScript)
local MyModule = require(ServerStorage.ModuleScript)ตอนนี้ ตัวแปร MyModule จะมีตารางโมดูลที่สร้างขึ้นในโมดูลสคริปต์นั้น เพื่อใช้ฟังก์ชันและตัวแปรจากตารางนั้น ให้พิมพ์ชื่อของตัวแปร ตามด้วยจุด และชื่อที่แน่นอนของสิ่งที่ต้องการใช้ในโมดูลสคริปต์นั้น เช่น MyModule.myFunction() เมื่อสคริปต์ทำงานและถึงบรรทัดนั้น มันจะเข้าถึงฟังก์ชันหรือตัวแปรเฉพาะที่เก็บอยู่ในตารางโมดูล
local MyModule = require(ServerStorage.ModuleScript)
MyModule.myFunction()ตัวอย่าง RewardManager
local RewardManager = {}
-- ใช้ได้เฉพาะในโมดูลสคริปต์
local rewardCoins = 50
-- ใช้ได้เฉพาะในโมดูลสคริปต์
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- ใช้ได้ในสคริปต์อื่น
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManagerlocal ServerStorage = game:GetService("ServerStorage")
-- โหลดโมดูลสคริปต์
local RewardManager = require(ServerStorage.RewardManager)
-- เรียกฟังก์ชันจากโมดูลสคริปต์
local coins = RewardManager.getCoinReward("easy")
print("ควรให้ " .. coins .. " เหรียญ")การแก้ไขปัญหาทั่วไป
เคล็ดลับบางประการที่นี่เกี่ยวกับปัญหาทั่วไปเมื่อทำงานกับโมดูลสคริปต์ โปรดจำไว้ว่าการทำงานกับโมดูลสคริปต์อาจเป็นหัวข้อที่ซับซ้อนที่มีความละเอียดมากขึ้น สำหรับรายละเอียดเพิ่มเติม โปรดดูคู่มือทางเทคนิคที่มีรายละเอียดเพิ่มเติมเกี่ยวกับ โมดูลสคริปต์
ปัญหา: ได้รับข้อความแสดงข้อผิดพลาดรวมถึง: "Infinite yield possible" หรือ "not a valid member".
- ตรวจสอบการสะกดของโมดูลสคริปต์ที่โหลด require() ต้องรวมเส้นทางและการสะกดที่แน่นอนของโมดูลสคริปต์ ซึ่งอาจมีชื่อแตกต่างจากตารางโมดูล
ปัญหา: ได้รับข้อความแสดงข้อผิดพลาดรวมถึง: "attempt to index global".
- ในสคริปต์ใด ๆ ที่ใช้โมดูลสคริปต์ ให้แน่ใจว่ามันถูกโหลดโดยใช้ฟังก์ชัน require() หากไม่เช่นนั้น สคริปต์นั้นไม่สามารถใช้ฟังก์ชันและตัวแปรจากโมดูลสคริปต์ได้
สรุป
โมดูลสคริปต์ ใน Roblox เป็นวิธีที่นักพัฒนาซอฟต์แวร์ใช้ในการจัดระเบียบและนำโค้ดกลับมาใช้ใหม่ โมดูลสคริปต์มักจะถูกเก็บไว้ใน ServerStorage (หรือ ReplicatedStorage สำหรับการโต้ตอบฝั่งไคลเอนต์) จากที่นั่น สคริปต์อื่น ๆ สามารถเรียกใช้ฟังก์ชันและตัวแปรที่เก็บอยู่ในโมดูลสคริปต์นั้นได้
ตัวอย่างเช่น เกมหนึ่งอาจให้คะแนนผู้เล่นสำหรับการเก็บวัตถุ โมดูลสคริปต์สามารถจัดการโค้ดเพื่อให้คะแนน จากนั้น สคริปต์สำหรับวัตถุประเภทต่าง ๆ สามารถเรียกใช้ฟังก์ชันของโมดูลสคริปต์ได้ ซึ่งลดความจำเป็นในการนำโค้ดกลับมาใช้ใหม่ระหว่างสคริปต์ ทำให้โค้ดเข้าใจและบำรุงรักษาได้ง่ายขึ้น