mirror of
https://github.com/Ukendio/jecs.git
synced 2025-09-14 04:29:18 +00:00
A fast, portable Entity Component System for Luau.
https://ukendio.github.io/jecs/
data-orienteddata-oriented-designecsentity-component-systemgame-developmentgamedevjecslualuauno-dependencies
Remove duplicate contains method section and update description to be more precise about checking both entities and components. Also fix example code references to use contains instead of has for consistency. |
||
---|---|---|
.github | ||
addons | ||
assets | ||
benches | ||
demo | ||
docs | ||
examples | ||
test | ||
thesis | ||
tools | ||
.gitattributes | ||
.gitignore | ||
.luaurc | ||
.prettierrc | ||
.stylua.toml | ||
bench.project.json | ||
CHANGELOG.md | ||
default.project.json | ||
jecs.d.ts | ||
jecs.luau | ||
LICENSE | ||
mirror.luau | ||
package-lock.json | ||
package.json | ||
README.md | ||
rokit.toml | ||
tsconfig.json | ||
wally.toml |
Just a stupidly fast Entity Component System
- Entity Relationships as first class citizens
- Iterate 800,000 entities at 60 frames per second
- Type-safe Luau API
- Zero-dependency package
- Optimized for column-major operations
- Cache friendly archetype/SoA storage
- Rigorously unit tested for stability
Installation
With Wally:
jecs = "ukendio/jecs@0.6.0" # Inside wally.toml
With pesde:
pesde add wally#ukendio/jecs@0.6.0
npm i @rbxts/jecs
Example
local world = jecs.World.new()
local pair = jecs.pair
-- These components and functions are actually already builtin
-- but have been illustrated for demonstration purposes
local ChildOf = world:component()
local Name = world:component()
local function parent(entity)
return world:target(entity, ChildOf)
end
local function getName(entity)
return world:get(entity, Name)
end
local alice = world:entity()
world:set(alice, Name, "alice")
local bob = world:entity()
world:add(bob, pair(ChildOf, alice))
world:set(bob, Name, "bob")
local sara = world:entity()
world:add(sara, pair(ChildOf, alice))
world:set(sara, Name, "sara")
print(getName(parent(sara)))
for e, name in world:query(Name, pair(ChildOf, alice)) do
print(name, "is the child of alice")
end
-- Output
-- "alice"
-- bob is the child of alice
-- sara is the child of alice
Benchmarks
21,000 entities 125 archetypes 4 random components queried.
Can be found under /benches/visual/query.luau
Inserting 8 components to an entity and updating them over 50 times.
Can be found under /benches/visual/insertions.luau