Skip to main content

Getting Started

tip

We highly recommend checking out the source code of our example game to see what this all looks like when set up in a real game. Clone the repo, build the project, open it up in your favorite editor and get some first hand experience. There's no better way to learn!

See the /example directory in the matter repo.

Scaffolding a new project

Here's how you scaffold a project with Matter.

First, import Matter at the top of your file. Then, create your World and your Loop.

init.server.luau
local Matter = require(ReplicatedStorage.Matter)

local world = Matter.World.new()

local loop = Matter.Loop.new(world) -- This makes Loop pass the world to all your systems.

Then, we should collect all of your systems and schedule them. Assuming they're in a systems folder inside this script:

init.server.luau
local systems = {}
for _, child in ipairs(script.systems:GetChildren()) do
if child:IsA("ModuleScript") then
table.insert(systems, require(child))
end
end

loop:scheduleSystems(systems)

Then, simply start the loop.

init.server.luau
loop:begin({
default = RunService.Heartbeat
})

Now your systems would run every heartbeat, if you had any. Let's make some.

systems/myFirstSystem.luau
local function myFirstSystem()
print("Hello world!")
end

return myFirstSystem

Now we're printing something 60 times per second. We should probably do something actually interesting instead.

Let's create a couple components.

components.luau
local Matter = require(ReplicatedStorage.Matter)

return {
Health = Matter.component(),
Poison = Matter.component(),
}

Let's make a system that removes 0.1 health every frame from things that are poisoned.

systems/poisonHurts.luau
local Components = require(script.Parent.components)
local Health = Components.Health
local Poison = Components.Poison

local function poisonHurts(world)
for id, health in world:query(Health, Poison) do
world:insert(id, health:patch({
value = health.value - 0.1
}))
end
end

We make use of the Component:patch function, which returns a new component with an updated value, so we don't have to mutate the existing component.

Next steps

You should dive in to the API reference! The Matter API is simple and documented in detail.

And if you haven't already, check out the /example directory in the matter repo.