UevKF8zjRV_WEtpJsXhr
We use cookies on this site to enhance your user experience

Intro to Module Scripts

Intro to Module Scripts

Modular Programming

Copying the same functions between multiple scripts can be time consuming and hard to manage. For example, in a game with a currency game system, you’ll find yourself using the same functions in many game mechanics, like rewarding players for finishing quests or buying items in a shop.

A better way to organize and reuse code is with module scripts, a unique type of script that stores a set of functions and variables designed to meet a shared purpose, like managing player money or enemies.

Code within module scripts can be used by other scripts. That way, you can call the same function that gives coins from multiple different scripts whenever a player finishes a quest or finds a pickup.

By storing commonly used code in module scripts, it makes maintaining and organizing code easier since changes only need to be made to one module script, rather than updating multiple scripts.

When to Use Module Scripts vs Scripts

Normal scripts should be used for standalone elements of a game, such as touching a pickup, while module scripts are useful for storing code that can be reused by multiple independent scripts, like rewarding points.


Module Script Basics

Create a ModuleScript in ServerStorage.

Module scripts are commonly created in ServerStorage where they won't run automatically. Instead, other scripts will run functions and get information from the module as needed.

Structure of Module Scripts

When created, every module script starts out with the code below:

local module = {}

return module

The line local module = {} creates a table, or container of code, where the module’s shared functions and variables can be stored. This table should be renamed to the module’s purpose, such as MoneyManager or ParticleController. As opposed to other variables which are pascal case (myVariable), module tables are recommended to start capitalized.

local MoneyManager = {}

return MoneyManager

So other scripts can use a module’s non-local functions or variables, every module ends with return myModule. Whenever another script tries to get code from the module, return lets that script access code stored inside the module table.

Adding to Module Scripts

To add a function or variable to the module which can be used in another script, type the module table’s name, followed by a dot, and the name of the function or variable, like in TestModule.myVariable. Using the dot operator is another way of adding code into a table, allowing other scripts to access that code whenever the module table is returned.

local TestModule = {}

-- Adds a variable to 'myModule' table
TestModule.myVariable = 100

-- Adds a function to 'myModule' table
function TestModule.doTask(player)
	-- Placeholder code
end

return TestModule
Type Between the Table and Return

Anything added to the module table must be typed between local myModule = {} and return myModule, or else the code will create an error.


Scope in Module Scripts

For a module function or variable to be used in an outside script, don’t type local.

Typing local in front of variables and functions means they are only usable by that script. While this is a good practice for most scripts for reducing errors and troubleshooting, you cannot make module script functions and variables local.

Any code used only by that module script should still include local. For instance, the code below includes the local variable questReward, which can only be used in that module script, and the function finishQuest(), which can be used in scripts outside the module.

local MoneyManager = {}

-- Usable only in the module script
local questReward = 100

-- Usable in other scripts
function MoneyManager.finishQuest(player)
	player.Money = player.Money + questReward
end

return MoneyManager

Using Modules In Others Scripts

By itself, a module script can’t run code — it needs to be loaded in another script using the keyword require(). The function require() accepts one argument, the location of the module script in the Explorer.

To use a module, in a separate script, set a variable equal to require(moduleScript).

local MoneyManager = require(ServerStorage.ModuleScript)

Now, the variable myModule contains the module table created in that module script. To use functions and variables from that table, type the variable name, followed by a dot, and the exact name of what to use in that module script, like myModule.myFunction(). When the script runs and reaches that line, it’ll access that specific function or variable stored in the module table.

Module Script - MoneyManager
local MoneyManager = {}

function MoneyManager.giveMoney(player, questReward)
    player.Money = player.Money + questReward
end

return MoneyManager
Normal Script - Coin Pickup
-- Load module script
local MoneyManager = require(MoneyManager)
local coinValue = 100

if player then
    --Calls function from module script
    moneyManager.giveMoney(player, coinValue)
end
Check Spelling When Typing in Other Scripts

If you’re in another script, make sure that the module script function or variable is spelled exactly the same as found in that module. To help, you can copy the exact function or variable name from the module and then just paste it in the normal script where it’ll be used.


General Troubleshooting

Below are some tips on how to resolve common issues when working with module scripts.

Issue: Get an error message including: "Infinite yield possible" or "not a valid member".

  • Check the spelling of the module script where it’s loaded. require() must include the exact path and spelling of the module script, which may be named differently than the module table.

Issue: Get an error message including: "attempt to index global".

  • In any scripts using a module script, make sure it’s loaded using the function require(). If not, that script cannot use functions and variables from the module script.