การใช้รหัสเดียวกัน

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

หลังจากสร้างสคริปต์ไม่กี่บรรทัด, มันไม่เคยนานก่อนที่คุณต้องการใช้รหัสบางส่วนระหว่างพวกเขา ขึ้นอยู่กับ ตําแหน่ง คุณสามารถใช้รหัสระหว่างสคริปต์ในด้านข

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

คุณสามารถวางสคริปต์โมดูลที่คุณวางสคริปต์ได้ทุกที่ แต่ ReplicatedStorage เป็นสถานที่ที่นิยมมาก; การเก็บสคริปต์โมดูลที่นี่ช่วยให้คุณสามารถใช้รหัสระหว่างเซิร์ฟเวอร์และลูกค้าได้

  1. ใน Roblox Studio เลือก ห้องเก็บของที่เลียนแบบ ใน หน้าต่าง Explorer และคลิก + 2. เลือก ModuleScript เพื่อเพิ่มสคริปต์โมดูลใหม่
  2. ให้คลิกขวาที่สคริปต์และเปลี่ยนชื่อมันเป็น PickupManager
  3. คลิกสคริปต์สองครั้งเพื่อเปิดใน เครื่องมือเขียนสคริปต์

สรรพสิทธิ์ของโมดูลสคริป

แต่ละ 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")
-- รับค่าที่กลับมาจากModuleScript
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
-- เรียกใช้งาน ModuleScript
local 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 = 20
GunConfig.AmmoCount = 100
GunConfig.Firerate = 600
GunConfig.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


-- สคริปต์ใน ReplicatedFirst
local 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)