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

โครงสร้างของโมดูลสคริปต์
เมื่อสร้างขึ้น โมดูลสคริปต์ทุกอันจะเริ่มต้นด้วยโค้ดด้านล่างนี้:
local Module = {}return Module
บรรทัด local Module = {} จะสร้างตารางหรือที่เก็บของโค้ดซึ่งฟังก์ชันและตัวแปรที่ใช้ร่วมกันของโมดูลสามารถถูกเก็บไว้ ตารางนี้ควรเปลี่ยนชื่อให้ตรงกับวัตถุประสงค์ของโมดูล เช่น RewardManager หรือ ParticleController ในขณะที่ตัวแปรอื่น ๆ มักใช้การเขียนแบบ Camel Case (myVariable) ตารางโมดูลแนะนำให้ใช้ Pascal Case และเริ่มต้นด้วยตัวพิมพ์ใหญ่ (MyModule)
local RewardManager = {}return RewardManager
เพื่อให้สคริปต์อื่น ๆ สามารถใช้ฟังก์ชันหรือตัวแปรที่ไม่เป็นท้องถิ่นของโมดูลได้ โมดูลทุกอันจะจบลงด้วยการ return MyModule ทุกครั้งที่สคริปต์อื่นพยายามเข้าถึงโค้ดจากโมดูล return จะทำให้สคริปต์นั้นสามารถเข้าถึงโค้ดที่ถูกเก็บไว้ในตารางโมดูล
เพิ่มเข้าไปในโมดูลสคริปต์
เพื่อเพิ่มฟังก์ชันหรือ ตัวแปรเข้าไปในโมดูลซึ่งสามารถใช้ในสคริปต์อื่น ให้พิมพ์ชื่อของตารางโมดูล ตามด้วยจุด และชื่อของฟังก์ชันหรือตัวแปร เช่น ใน TestModule.myVariable การใช้ตัวดำเนินการจุดจะเป็นอีกวิธีในการเพิ่มโค้ดลงในตาราง ทำให้สคริปต์อื่น ๆ สามารถเข้าถึงโค้ดนั้นได้เมื่อใดก็ตามที่ตารางโมดูลถูก return
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
ModuleScript - 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 RewardManager
Script - TreasureChestScriptlocal ServerStorage = game:GetService("ServerStorage")-- โหลดโมดูลสคริปต์local RewardManager = require(ServerStorage.RewardManager)--เรียกฟังก์ชันจากโมดูลสคริปต์local coins = RewardManager.getCoinReward("easy")print("ควรให้ " .. coins .. " เหรียญ")
การแก้ปัญหาทั่วไป
เคล็ดลับบางอย่างที่นี่พูดถึงปัญหาทั่วไปเมื่อทำงานกับโมดูลสคริปต์ โปรดจำไว้ว่าการใช้โมดูลสคริปต์อาจเป็นหัวข้อที่ซับซ้อนด้วยความละเอียดมากขึ้น สำหรับข้อมูลเพิ่มเติม โปรดดูคู่มือตั้งเทคนิคนี้เกี่ยวกับ โมดูลสคริปต์
ปัญหา: พบข้อความแสดงข้อผิดพลาดที่ประกอบด้วย: "เกิดการยืดอายุไม่สิ้นสุด" หรือ "ไม่ใช่สมาชิกที่ถูกต้อง"
- ตรวจสอบการสะกดของโมดูลสคริปต์เมื่อโหลด require() ต้องรวมเส้นทางและการสะกดที่ถูกต้องของโมดูลสคริปต์ซึ่งอาจมีชื่อแตกต่างจากตารางโมดูล
ปัญหา: พบข้อความแสดงข้อผิดพลาดที่ประกอบด้วย: "พยายามจัดทำดัชนีทั่วโลก"
- ในสคริปต์ใด ๆ ที่ใช้โมดูลสคริปต์ ให้แน่ใจว่ามีการโหลดโดยใช้ฟังก์ชัน require() หากไม่เช่นนั้น สคริปต์นั้นจะไม่สามารถใช้ฟังก์ชันและตัวแปรจากโมดูลสคริปต์ได้
สรุป
โมดูลสคริปต์ ใน Roblox เป็นวิธีที่นักพัฒนาทำเพื่อจัดระเบียบและใช้โค้ดซ้ำ โมดูลสคริปต์มักจะถูกเก็บไว้ใน ServerStorage (หรือ ReplicatedStorage สำหรับการโต้ตอบของลูกค้า) จากนั้น สคริปต์อื่น ๆ สามารถเรียกฟังก์ชันและตัวแปรที่เก็บอยู่ในโมดูลสคริปต์นั้นได้
ตัวอย่างเช่น ประสบการณ์หนึ่งอาจให้คะแนนผู้เล่นสำหรับการเก็บวัตถุ โมดูลสคริปต์สามารถจัดการโค้ดเพื่อมอบคะแนน แล้วสคริปต์สำหรับวัตถุประเภทต่าง ๆ ก็สามารถเรียกใช้ฟังก์ชันของโมดูลสคริปต์ได้ ซึ่งลดความจำเป็นในการใช้โค้ดซ้ำระหว่างสคริปต์ ทำให้โค้ดเข้าใจและบำรุงรักษาง่ายขึ้น