แนะนำสคริปต์โมดูล

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

เมื่อโครงการมีความซับซ้อนมากขึ้น การคิดว่าสคริปต์จะถูกจัดระเบียบอย่างไรจึงเป็นสิ่งสำคัญการปฏิบัติการจัดระเบียบที่ดีสามารถรับประกันได้ว่ารหัสไม่ถูกซ้ำระหว่างสคริปต์ หรือยากที่จะจัดการ

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

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

พื้นฐานของสคริปต์โมดูล

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

สร้างสคริปต์โมดูล

ModuleScripts มักจะถูกวางใน ServerScriptService เมื่อใช้โดยสคริปต์ด้านเซิร์ฟเวอร์และ ReplicatedStorage เมื่อใช้โดยสคริปต์ด้านท้องถิ่น (เช่นการโต้ตอบ GUI)

  1. สร้าง ModuleScript ใน ServerScriptService

โครงสร้างของสคริปต์โมดูล

เมื่อสร้างแล้ว สคริปต์ของแต่ละโมดูลจะเริ่มต้นด้วยโค้ดด้านล่าง:


local Module = {}
return Module

บรรทัด local Module = {} สร้างตารางหรือคอนเทนเนอร์ของโค้ดที่สามารถเก็บฟังก์ชันและตัวแปรที่แชร์ของโมดูลได้ตารางนี้ควรถูกเปลี่ยนชื่อเป็นวัตถุประสงค์ของโมดูล เช่น RewardManager หรือ ParticleControllerเมื่อเทียบกับตัวแปรอื่นที่เป็นกรณีอูฐ ( myVariable ) แท็บเล็ตของโมดูลแนะนำให้ใช้กรณีปาสคาลและเริ่มต้นด้วยการเขียนใหญ่ ( 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 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 - ผู้จัดการรางวัล

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
สคริปต์ - TreasureChestScript

local ServerStorage = game:GetService("ServerStorage")
-- โหลดสคริปต์โมดูล
local RewardManager = require(ServerStorage.RewardManager)
--เรียกฟังก์ชันจากสคริปต์โมดูล
local coins = RewardManager.getCoinReward("easy")
print("Should award " .. coins .. " coins")

การแก้ปัญหาทั่วไป

เคล็ดลับบางอย่างที่นี่จะแก้ปัญหาทั่วไปเมื่อทำงานกับสคริปต์โมดูลโปรดจำไว้ว่าสคริปต์โมดูลสามารถเป็นหัวข้อที่ซับซ้อนพร้อมกับรายละเอียดเพิ่มเติมสำหรับรายละเอียดเพิ่มเติม ดูคู่มือทางเทคนิคนี้เพิ่มเติมเกี่ยวกับ สคริปต์โมดูล ปัญหา: รับข้อความแจ้งข้อผิดพลาดรวมถึง: "Infinite yield possible" หรือ "not a valid member" .

  • ตรวจสอบการสะกดของสคริปต์โมดูลที่โหลดแล้วrequire() ต้องรวมเส้นทางและการสะกดคำที่แน่นอนของสคริปต์โมดูลซึ่งอาจมีชื่อแตกต่างจากตารางโมดูล ปัญหา: รับข้อความแจ้งข้อผิดพลาดรวมถึง: "attempt to index global"

  • ในสคริปต์ใดๆ ที่ใช้สคริปต์โมดูล ตรวจสอบให้แน่ใจว่าโหลดโดยใช้ฟังก์ชัน require()หากไม่ได้, สคริปต์นั้นไม่สามารถใช้ฟังก์ชันและตัวแปรจากสคริปต์โมดูลได้

สรุป

สคริปต์โมดูล ใน Roblox รหัสServerStorage (หรือ ReplicatedStorage สำหรับการโต้ตอบแบบไคลเอนต์)จากที่นั่น สคริปต์อื่นสามารถเรียกฟังก์ชันและตัวแปรที่เก็บไว้ในสคริปต์โมดูลนั้นได้

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