หลังจากสร้างสคริปต์ไม่กี่บรรทัด, มันไม่เคยนานก่อนที่คุณต้องการใช้รหัสบางส่วนระหว่างพวกเขา ขึ้นอยู่กับ ตําแหน่ง คุณสามารถใช้รหัสระหว่างสคริปต์ในด้านข
การสร้างสคริปโมดูล
คุณสามารถวางสคริปต์โมดูลที่คุณวางสคริปต์ได้ทุกที่ แต่ ReplicatedStorage เป็นสถานที่ที่นิยมมาก; การเก็บสคริปต์โมดูลที่นี่ช่วยให้คุณสามารถใช้รหัสระหว่างเซิร์ฟเวอร์และลูกค้าได้
- ใน Roblox Studio เลือก ห้องเก็บของที่เลียนแบบ ใน หน้าต่าง Explorer และคลิก + 2. เลือก ModuleScript เพื่อเพิ่มสคริปต์โมดูลใหม่
- ให้คลิกขวาที่สคริปต์และเปลี่ยนชื่อมันเป็น PickupManager
- คลิกสคริปต์สองครั้งเพื่อเปิดใน เครื่องมือเขียนสคริปต์
สรรพสิทธิ์ของโมดูลสคริป
แต่ละ ModuleScript เริ่มด้วยรหัสต่อไปนี้:
local module = {}return module
รหัสนี้สร้างตาราง Luau ที่ว่างเปล่า และส่งคืนให้กับสคริปที่ต้องการโมดูลสคริป
ค่ากลับสามารถเป็นข้อมูลใด ๆ ประเภทข้อมูล ยกเว้น nil อย่างไรก็ตามส่วนใหญ่ของโมดูลสคริปต์กลับมาให้ค่ากลับมาเป็นฟังก์ชัน ตาราง รหัส
ตัวอย่างต่อไปนี้กลับมาเป็นตารางที่มีคุณสมบัติเดียวที่เรียกว่า getPickupBonus ใส่มันในสคริปต์โมดูลใหม่ของคุณ:
-- ModuleScript ใน ReplicatedStorage
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- เพิ่มตัวอักษร getPickupBonus ในตาราง PickupManager
PickupManager.getPickupBonus = function(rarity)
local bonus = rarityMultipliers[rarity] * defaultMultiplier
return bonus
end
return PickupManager
ติดตาม
ต้องการสคริปโมดูล
เพื่อโหลดสคริปโมดูล, คุณเรียกคุณสมบัติ require() ใน ReplicatedStorage เพิ่มสคริปต์ใหม่และเปลี่ยน RunContext ของมันเป็น 1>Client</
สคริปต์ลูกค้าใน ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- รับค่าที่กลับมาจากModuleScriptlocal PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))-- เรียกใช้งาน ModuleScriptlocal bonus = PickupManager.getPickupBonus("legendary")print(bonus) --> 125
คุณสามารถใช้รหัสเดียวกันเพื่อต้องการสคริปจาก ServerScriptService :
สคริปท์ใน ServerScriptStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- รับค่ากลับสำหรับโมดูลสคริปต์ที่มีชื่อ "PickupManager"local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
เมื่อคุณเรียก require() บน ModuleScript มันจะดำเนินการอยู่ครั้งเดียวและกลับม
หากคุณต้องการ ModuleScript จากทั้งสองด้านของเขตเข้าถึงระหว่างเซิร์ฟเวอร์คลายเคลื่อนของลูกค้า ModuleScript จะส่งค่าอ้างอิงที่ไม่ซ้ำกันสำหรับแต่ละด้าน
รูปแบบ
สคริปต์โมดูลมีรูปแบบที่พบบ่อยที่คุณสามารถใช้เพื่อเรียบเรียงโค้ดของคุณและหลีกเลี่ยงกับดักในขณะที่ประสบการณ์ของคุณเติบโตขึ้นในขนาดและความซับซ้อน
การแชร์ข้อมูล
เพื่อเชื่อมโยงข้อมูลกับรายการเฉพาะคุณสามารถกำหนดค่าตัวแก่พวกเขาหรือสร้าง Configuration ไฟล์เกี่ยวข้องกับข้อมูลมูลค่าเช่น StringValue หรือ
หากคุณต้องการปรับปรุงข้อมูลเดียวกันสำหรับหลายคันของเดียวกันหรือใช้เดียวกันสำหรับวัตถุที่แตกต่างกันสตอร์กข้อมูลใน ModuleScripts เป็นวิธีที่ง่ายขึ้นสำหรับคุณใน
ตัวอย่างต่อไป ModuleScript ใน ReplicatedStorage เก็บค่าการกำหนดค่าการกำหนดค่าสำหรับปืนทั่วไป:
ModuleScript ใน ReplicatedStorage
local GunConfig = {}GunConfig.MagazineSize = 20GunConfig.AmmoCount = 100GunConfig.Firerate = 600GunConfig.Damage = {["Head"] = 50;["Torso"] = 40;["Body"] = 25;}return GunConfig
เหตุการณ์ที่กำหนดเอง
เหตุการณ์ที่กำหนดเองช่วยให้สคริปต์สื่อสารกันได้ แต่การต้องมีการติดตามอ้างอิงไปยังเว็บไซต์ BindableEvent ต่างๆ รหัส
คุณสามารถใช้ ModuleScripts เพื่อเก็บ BindableEvents และให้มือถือการจัดการอีเวนต์ที่เกี่ยวข้องโดยตรงกับวิธีการของ ModuleScript
ต่อไป ModuleScript ใน ReplicatedStorage มีเหตุการณ์ที่กำหนดเวลาที่เปิดใช้งานเมื่อสวิตช์เปลี่ยนสถานะ:
ModuleScript ใน ReplicatedStorage
local Switch = {}
-- การสร้างตัวผูกเพื่อให้สคริปต์ใด ๆ สามารถฟังได้เมื่อสวิตช์ถูกเปลี่ยน
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch
สคริปต์ลูกค้าต่อไปใน ReplicatedStorage เชื่อมต่อฟังก์ชันที่จะเรียกใช้เมื่อเหตุการณ์ Switch.Changed เกิดขึ้น
สคริปใน ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(newState)
print("Switch state is now", newState)
end
-- ทดสอบการเปลี่ยนแปลงไม่กี่ครั้ง
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()
การแคปซูล
การแคปซูลคือการสร้างระดับความสมบูรณ์ของการแสดงผลรอบตัววัตถุหรือโลจิกเพื่อซ่อนความซับซ้อน คุณสามารถใช้ ModuleScripts เพื่อแคปซูล Roblox ด้วยการใช้งาน Lua ที่กำหนดเองเพื่อเรี
ตัวอย่างเช่น คุณสามารถใช้การแคปซูลได้เพื่อ:
- เรียบเรียงการสื่อสารระหว่างเครือข่ายด้วยวัตถุ RemoteEvent เดียว
- ラップข้อมูลการจัดการข้อผิดพลาดรอบบริการที่มีความไวต่อการเปลี่ยนแปลงและข้อผิดพลาดใด ๆ เช่น DataStoreService
- กำหนดวิธีการที่กำหนดเองเพื่อควบคุมหรือขยายคุณสมบัติของวัตถุ Roblox
มันยากที่จะติดตามสิบสอง RemoteEvent วัตถุเพื่อให้เป็นเกมเครือข่าย คุณสามารถใช้ ModuleScript เพื่อรวบรวม
ในตัวอย่างด้านล่าง, ModuleScript ที่มีชื่อว่า
ต่อไป ModuleScript ใน ReplicatedFirst ให้ฟังก์ชันที่เก็บไว้ในตัวที่คุณสามารถโทรไปยังสคริปต์ของลูกค้าของคุณเพื่อส่งข้อความเครือข่าย:
โมดูลเครือข่าย
-- ModuleScript ใน ReplicatedFirst ที่มีชื่อว่า NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- การเก็บรวมระบบ FireServer ของรายการระยะไกล
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient
ต่อไป ModuleScript ใน ServerScriptService ใช้ BindableEvents สำหรับทุกสคริปต์เพื่อเชื่อมต่อไปยังไอดีที่กำหนดเอง เมื่อเครื่องมือส่งข้อความเคร
-- ModuleScript ใน ServerScriptService ชื่อ NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- การเชื่อมต่อเหตุการณ์ที่เชื่อมต่อใหม่ให้กับ id
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- การเชื่อมต่อกับ
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- การค้นหาเหตุการณ์ที่ผูกได้ทุกอันที่ตรงกับรหัสของเหตุการณ์รีโมทที่ได้รับ
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer
ต่อไป LocalScript ส่งข้อความด้วย ID RequestA ด้วยตัวอย่าง Hello อpcional
-- สคริปต์ใน ReplicatedFirstlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))NetworkManagerClient.FireServer("RequestA", "Hello")
ต่อไป Script เชื่อมต่อกับไอดีข้อความเครือข่าย RequestA และพิมพ์คำสั่งพร้อมด้วยตัวแปรใด ๆ เมื่อได้รับคำขอ
-- สคริปท์ใน ServerScriptService
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Received RequestA from", player, ...)
end)