Sau khi tạo một vài script, nó không bao giờ dài trước khi bạn muốn sử dụng lại một số mã giữa chúng. Tùy thuộc vào vị trí , ModuleScripts để bạn có thể sử dụng mã giữa các bên của giới hạn client-server hoặc cùng một bên của giớ
Tạo Scrip Mô-đun
Bạn có thể đặt các tập lệnh module ở bất kỳ nơi nào bạn đặt các tập lệnh, nhưng ReplicatedStorage là một vị trí phổ biến; lưu các tập lệnh module ở đây cho phép bạn tái sử dụng mã giữa máy chủ và khách hàng.
- Chọn ModuleScript để thêm một mô-đun mới.
- Nhấp chuột phải vào script và đổi tên nó thành PickupManager .
- Nhấp chuột gấp đôi vào script để mở nó trong Editor Script .
Hồi tâm của một mô-đun script
Mỗi ModuleScript bắt đầu với mã sau đây:
local module = {}return module
Mã này tạo ra một bảng Luau trống và trả về nó cho bất kỳ script nào yêu cầu script modul.
Giá trị trả về có thể là bất kỳ loại dữ liệu nào ngoại trừ nil, nhưng hầu hết các mô-đun tập trung trả về một chức năng, một bảng hoặc một bảng các chức năng. Để tạo ra giá trị trả về của mô-đun, mô-đun tập trung có thể chạy bất kỳ mã nà
Ví dụ sau đây trả lại một bảng với một chức năng duy nhất được gọi là getPickupBonus . Ví dụ này được tích hợp vào mô-đun mới của bạn:
-- ModuleScript trong ReplicatedStorage
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- Thêm chức năng getPickupBonus vào bảng PickupManager
PickupManager.getPickupBonus = function(rarity)
local bonus = rarityMultipliers[rarity] * defaultMultiplier
return bonus
end
return PickupManager
Thêm chức năng vào một bảng không nhất thiết là cần thiết - bạn chỉ có thể trả lại chức năng nó chính là—nhưng nó là một mô hình tốt để theo dõi; nó cho phép bạn dễ dàng hiểu ngữ cảnh khi bạn gọi chức năng từ một script khác và cho phép bạn dễ dàng thêm thêm chức năng vào bảng tổng k
Yêu cầu Script Mô-đun
Để tải một mô-đun script, bạn gọi chức năng require() . Trong ReplicatedStorage , thêm một mô-đun mới, và thay đổi RunContext của nó thành 1> Client1> . Sau đó, thêm m
Tập lệnh khách hàng trong ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Nhận giá trị được trả lại bởiModuleScriptlocal PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))-- Gọi một hàm ModuleScriptlocal bonus = PickupManager.getPickupBonus("legendary")print(bonus) --> 125
Bạn có thể sử dụng cùng một mã để yêu cầu script từ ServerScriptService :
Script ở ServerScriptStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Lấy giá trị trả về cho ModuleScript tên "PickupManager"local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
Khi bạn gọi require() trên một ModuleScript , nó sẽ chạy một lần và trả một mục đơn như một tham chiế
Nếu bạn yêu cầu một ModuleScript từ cả hai bên biên giới client-server, ModuleScript đều trả lại một tham chiếu độc nhất cho mỗi bên.
Muster
Các tập hợp dữ liệu mô-đun có một số mẫu thông thường mà bạn có thể sử dụng để đơn giản hóa mã của bạn và tránh các hành động lừa đảo khi kinh nghiệm của bạn lớn hơn và phức tạp hơn.
Chia sẻ dữ liệu
Để liên kết dữ liệu với các ô tượng cụ thể, bạn có thể gán các thuộc tính cho chúng hoặc tạo Configuration mục đựng dữ liệu với các thuộc tính giá trị như StringValue hoặc IntValue . Tuy nhiên
Nếu bạn muốn điều chỉnh cùng một dữ liệu cho nhiều bản sao của cùng một đối tượng hoặc tái sử dụng cùng một dữ liệu cho nhiều đối tượng khác nhau, lưu dữ liệu vào ModuleScripts . Đây là cách dễ dàng hơn để bạn lưu dữ liệu trong
Ví dụ sau đây ModuleScript trong ReplicatedStorage lưu giá trị cấu hình cho một khẩu súng genéric:
ModuleScript trong ReplicatedStorage
local GunConfig = {}GunConfig.MagazineSize = 20GunConfig.AmmoCount = 100GunConfig.Firerate = 600GunConfig.Damage = {["Head"] = 50;["Torso"] = 40;["Body"] = 25;}return GunConfig
Sự kiện Tùy chỉnh
Sự kiện tùy chỉnh cho phép các script truyền thông với nhau, nhưng phải để mắt đến những tham chiếu đến các ô BindableEvent cụ thể có thể làm cho mã của bạn phức tạp.
Bạn có thể sử dụng ModuleScripts để lưu BindableEvents và cung cấp các hành xử người dùng tùy chỉnh được kết nối trực tiếp với các phương thức của ModuleScript .
Các ModuleScript sau đây trong ReplicatedStorage có sự kiện tùy chỉnh khi công tắc thay đổi trạng thái:
ModuleScript trong ReplicatedStorage
local Switch = {}
-- Tạo một liên kết để bất kỳ script nào cũng có thể lắng nghe khi công tắc được thay đổi
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch
Script khách hàng sau ở ReplicatedStorage kết nối một chức năng để gọi khi sự kiện Switch.Changed bắt đầu.
Script ở ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(newState)
print("Switch state is now", newState)
end
-- Thử nghiệm flipping một vài lần
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()
Hàm chuẩn
Đóng gói là thực hành tạo ra một lớp trừu tượng xung quanh các thống kê hoặc logics để ẩn sự phức tạp. Bạn có thể sử dụng ModuleScripts để đóng gói các thống kê Roblox với các hàm Lua tùy chỉnh để đơn giản hóa mã.
Ví dụ, bạn có thể sử dụng kết hợp để:
- Đơn giản hóa giao tiếp giữa các mạng với một đối tượng RemoteEvent đơn giản.
- Wrap error handling code around sensitive services such as DataStoreService .
- Định nghĩa các phương thức tùy chỉnh để điều khiển hoặc mở rộng các tính năng của Roblox.
Thật khó để theo dõi hàng loạt các đối tượng RemoteEvent 個別 lỗi để triển khai mạng trong trò chơicủa bạn. Bạn có thể sử dụng một ModuleScript để encaps
Trong ví dụ bên dưới, ModuleScript được gọi là NetworkManagerClient</
Các ModuleScript sau đây trong ReplicatedFirst cung cấp một chức năng được khắc ghi mà bạn có thể gọi trên các kịch bản khách hàng của bạn để gửi một thông tin nhắnmạng:
Modul mạng
-- ModuleScript được đổi tên thành NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Lập trình FireServer cho đối tượng xa
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient
Các thành phần dưới đây ModuleScript trong ServerScriptService sử dụng BindableEvents cho mỗi script kết nối với một ID cụ thể. Khi một khách hàng gửi một tin nhắnđiện mạng, mỗi 1> Class.BindableEvent
-- ModuleScript trong ServerScriptService tên là NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Kết nối sự kiện mới có thể kết nối với id
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Kết Nối với
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Tìm mọi sự kiện có thể tùy chỉnh tương ứng với id của sự kiện đã nhận
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer
Các thông điệp sau đây LocalScript gửi một thông điệp với ID RequestA với một lập luận tùy chọn Hello .
-- LocalScript trong ReplicatedFirstlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))NetworkManagerClient.FireServer("RequestA", "Hello")
Các Script tiếp theo kết nối với ID tin nhắn mạng RequestA và in một tuyên bố với bất kỳ tham số bổ sung nào khi nó nhận yêu cầu.
-- Script trong ServerScriptService
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Received RequestA from", player, ...)
end)