Khi các dự án trở nên phức tạp, điều quan trọng là phải suy nghĩ về cách tổ chức các script. Những thực hành tổ chức tốt có thể đảm bảo rằng mã không bị trùng lặp giữa các script hoặc trở nên khó quản lý.
Một cách tốt hơn để tổ chức và tái sử dụng mã là sử dụng module scripts, một loại script độc đáo lưu trữ một tập hợp các hàm và biến được thiết kế để đáp ứng một mục đích chung, chẳng hạn như quản lý tiền của người chơi hoặc kẻ thù. Mã trong các module scripts có thể được sử dụng bởi các script khác. Bằng cách đó, bạn có thể gọi cùng một hàm cung cấp tiền xu từ nhiều script khác nhau mỗi khi một người chơi hoàn thành một nhiệm vụ hoặc tìm thấy một vật phẩm.
Bằng cách lưu trữ mã thường được sử dụng trong các module scripts, việc duy trì và tổ chức mã trở nên dễ dàng hơn vì chỉ cần thực hiện thay đổi đối với một module script, thay vì cập nhật nhiều script.
Cơ bản về module scripts
Module scripts thực sự là một đối tượng riêng biệt so với các đối tượng script. Trong Roblox, các module scripts có thể được đánh dấu bằng biểu tượng tím.
Tạo một module script
ModuleScripts thường được đặt trong ServerScriptService khi được sử dụng bởi các script phía máy chủ và ReplicatedStorage khi được sử dụng bởi các script local phía client (như tương tác GUI).
- Tạo một ModuleScript trong ServerScriptService.

Cấu trúc của module scripts
Khi được tạo ra, mỗi module script sẽ bắt đầu với mã dưới đây:
local Module = {}return Module
Dòng local Module = {} tạo một bảng, hoặc container của mã, nơi mà các hàm và biến chia sẻ của module có thể được lưu trữ. Bảng này nên được đổi tên thành mục đích của module, chẳng hạn như RewardManager hoặc ParticleController. Khác với các biến khác mà sử dụng kiểu camel case (myVariable), các bảng module được khuyến nghị sử dụng kiểu pascal case và bắt đầu với chữ cái hoa (MyModule).
local RewardManager = {}return RewardManager
Để các script khác có thể sử dụng các hàm hoặc biến không phải địa phương của module, mỗi module kết thúc bằng lệnh return MyModule. Mỗi khi một script khác cố gắng truy cập mã từ module, return cho phép script đó truy cập mã được lưu trữ bên trong bảng module.
Thêm vào module scripts
Để thêm một hàm hoặc biến vào module có thể được sử dụng trong một script khác, gõ tên của bảng module, theo sau là dấu chấm, và tên của hàm hoặc biến, như trong TestModule.myVariable. Việc sử dụng toán tử chấm là một cách khác để thêm mã vào một bảng, cho phép các script khác truy cập mã đó mỗi khi bảng module được trả về.
local TestModule = {}
-- Thêm một biến vào bảng 'TestModule'
TestModule.myVariable = 100
-- Thêm một hàm vào bảng 'TestModule'
function TestModule.doTask(player)
-- Mã mẫu
end
return TestModule
Phạm vi trong module scripts
Để một hàm hoặc biến của module có thể được sử dụng trong một script bên ngoài, không gõ local.
Gõ local trước các biến và hàm có nghĩa là chúng chỉ có thể được sử dụng bởi script đó. Trong khi đây là một thực hành tốt cho hầu hết các script nhằm giảm thiểu lỗi và khắc phục sự cố, bạn không thể làm cho các hàm và biến của module trở thành local.
Bất kỳ mã nào chỉ được sử dụng bởi module script đó vẫn nên bao gồm local. Ví dụ, mã dưới đây bao gồm biến local difficultyModifier, chỉ có thể được sử dụng trong module script, và hàm getCoinReward(), có thể được sử dụng trong các script bên ngoài module.
local RewardManager = {}
-- Chỉ có thể sử dụng trong module script
local rewardCoins = 50
-- Chỉ có thể sử dụng trong module script
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Có thể sử dụng trong các script khác
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Sử dụng modules trong các script khác
Một mình, một module script không thể chạy mã — nó cần được tải vào một script khác bằng cách sử dụng từ khóa require(). Hàm require() chấp nhận một tham số, vị trí của module script trong Explorer.
Để sử dụng một module, trong một script riêng, thiết lập một biến bằng require(moduleScript).
local MyModule = require(ServerStorage.ModuleScript)
Bây giờ, biến MyModule chứa bảng module được tạo ra trong module script đó. Để sử dụng các hàm và biến từ bảng đó, gõ tên biến, theo sau là dấu chấm, và tên chính xác của những gì sẽ sử dụng trong module script đó, như MyModule.myFunction(). Khi script chạy và đến dòng đó, nó sẽ truy cập vào hàm hoặc biến cụ thể được lưu trữ trong bảng module.
local MyModule = require(ServerStorage.ModuleScript)MyModule.myFunction()
Ví dụ về RewardManager
ModuleScript - RewardManager
local RewardManager = {}
-- Chỉ có thể sử dụng trong module script
local rewardCoins = 50
-- Chỉ có thể sử dụng trong module script
local difficultyModifier = {
easy = 0.5,
normal = 1,
hard = 2
}
-- Có thể sử dụng trong các script khác
function RewardManager.getCoinReward(difficulty)
local coins = difficultyModifier[difficulty] * rewardCoins
return coins
end
return RewardManager
Script - TreasureChestScriptlocal ServerStorage = game:GetService("ServerStorage")-- Tải module scriptlocal RewardManager = require(ServerStorage.RewardManager)--Gọi hàm từ module scriptlocal coins = RewardManager.getCoinReward("easy")print("Nên trao thưởng " .. coins .. " đồng tiền")
Khắc phục sự cố chung
Một số mẹo dưới đây giải quyết các vấn đề thường gặp khi làm việc với các module scripts. Hãy nhớ rằng các module scripts có thể là một chủ đề phức tạp với nhiều sắc thái hơn. Để biết thêm chi tiết, hãy xem hướng dẫn kỹ thuật hơn về Module Scripts.
Vấn đề: Nhận thông báo lỗi bao gồm: "Có thể xảy ra vô hạn" hoặc "không phải là một thành viên hợp lệ".
- Kiểm tra chính tả của module script nơi nó được tải. require() phải bao gồm chính xác đường dẫn và chính tả của module script, có thể có tên khác với bảng module.
Vấn đề: Nhận thông báo lỗi bao gồm: "cố gắng chỉ mục toàn cầu".
- Trong bất kỳ script nào sử dụng một module script, hãy chắc chắn rằng nó được tải bằng hàm require(). Nếu không, script đó không thể sử dụng các hàm và biến từ module script.
Tóm tắt
Module scripts trong Roblox là một phương pháp mà các lập trình viên sử dụng để tổ chức và tái sử dụng mã. Một module script thường được lưu trữ trong ServerStorage (hoặc ReplicatedStorage cho các tương tác dựa trên client). Từ đó, các script khác có thể gọi các hàm và biến được lưu trữ trong module script đó.
Chẳng hạn, một trải nghiệm có thể thưởng điểm cho người chơi khi thu thập vật phẩm. Một module script có thể xử lý mã để cung cấp điểm. Sau đó, các script cho các loại vật phẩm khác nhau chỉ cần gọi hàm của module script. Điều này giảm thiểu nhu cầu tái sử dụng mã giữa các script, làm cho mã dễ hiểu và duy trì hơn.