Reusing Mã

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

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.

  1. Trong Roblox Studio, hover over ReplicatedStorage in the Cửa sổ Explorer and click + .
  2. Chọn ModuleScript để thêm một mô-đun mới.
  3. Nhấp chuột phải vào script và đổi tên nó thành PickupManager .
  4. 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ởiModuleScript
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
-- Gọi một hàm ModuleScript
local 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 = 20
GunConfig.AmmoCount = 100
GunConfig.Firerate = 600
GunConfig.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 ReplicatedFirst
local 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)