miniplex
from verekia/r3f-gamedev
⚛️ React Three Fiber Game Dev Recipes
npx skills add https://github.com/verekia/r3f-gamedev --skill miniplexSKILL.md
Miniplex ECS
Use Miniplex for minimalistic Entity Component System with TypeScript support.
When setting up or undertaking important changes with Miniplex, fetch the documentations:
Core: https://raw.githubusercontent.com/hmans/miniplex/refs/heads/main/packages/core/README.md React bindings: https://raw.githubusercontent.com/hmans/miniplex/refs/heads/main/packages/react/README.md
Technique
Define an entity type with optional properties, create a world, and query entities based on their properties. Use miniplex-react for React bindings with the Entities component.
Key Concepts
- Entity type defines all possible components as optional properties
world.with('prop1', 'prop2')creates typed queriesworld.add()andworld.remove()for entity lifecycleworld.addComponent()andworld.removeComponent()for component lifecycle<Entities in={query}>{Component}</Entities>renders entities reactively- Entity props are passed directly to child components
What NOT to Use
onEntityAdded/onEntityRemoved- Prefer using data and systems to trigger things (e.g., timers, flags).where()- Don't use predicate-based filtering
Preferred Methods
Only use these world methods:
world.add(entity)- Add a new entityworld.remove(entity)- Remove an entityworld.addComponent(entity, 'component', value)- Add component to existing entityworld.removeComponent(entity, 'component')- Remove component from entityworld.with('prop1', 'prop2')- Create queries
Queries
Declare queries at module level and import them where needed:
// ecs/queries.ts
export const characterQuery = world.with('position', 'isCharacter')
export const enemyQuery = world.with('position', 'isEnemy')
export const movingEntities = world.with('position', 'velocity')
// In a system file
import { movingEntities } from './ecs/queries'
Usage
type Entity = {
position?: { x: number; y: number }
isCharacter?: true
}
const world = new World<Entity>()
const characters = world.with('position', 'isCharacter')
// Add entity
world.add({ position: { x: 0, y: 0 }, isCharacter: true })
// Render
<Entities in={characters}>{Character}</Entities>
Note: Miniplex is feature-complete but no longer maintained.
This skill is part of verekia's r3f-gamedev.