jecs/docs/api/world-entity-management.md

215 lines
5.3 KiB
Markdown
Raw Normal View History

# Entity Management
This section covers methods for managing entities in the jecs World.
## delete
Deletes an entity (and its components/relationships) from the world entirely.
```luau
function World:delete(entity: Entity): void
```
### Parameters
| Name | Type | Description |
|------|------|-------------|
| entity | Entity | The entity to delete from the world |
### Behavior
1. Invokes any `OnRemove` hooks for all components on the entity
2. Triggers any cleanup actions based on `OnDelete` and `OnDeleteTarget` relationships
3. Removes the entity from all archetypes
4. Recycles the entity ID for future use
### Example
::: code-group
```luau [luau]
local world = jecs.World.new()
-- Create an entity
local entity = world:entity()
world:set(entity, Position, {x = 0, y = 0})
-- Delete the entity
world:delete(entity)
-- The entity no longer exists in the world
assert(not world:contains(entity))
```
```typescript [typescript]
import { World } from "@rbxts/jecs";
const world = new World();
// Create an entity
const entity = world.entity();
world.set(entity, Position, {x: 0, y: 0});
// Delete the entity
world.delete(entity);
// The entity no longer exists in the world
assert(!world.contains(entity));
```
:::
### Child Entity Deletion
When an entity has children (via the `ChildOf` relationship), deleting the parent can also delete the children if the appropriate cleanup policy is set:
```luau
-- Set up parent-child relationship
local ChildOf = world:component()
world:add(ChildOf, jecs.pair(jecs.OnDeleteTarget, jecs.Delete))
local parent = world:entity()
local child = world:entity()
-- Make child a child of parent
world:add(child, jecs.pair(ChildOf, parent))
-- Deleting parent will also delete child
world:delete(parent)
assert(not world:contains(child))
```
### Component Deletion
The `delete` method can also be used to delete a component definition:
```luau
local Temporary = world:component()
world:add(Temporary, jecs.pair(jecs.OnDelete, jecs.Remove))
-- Add Temporary to entities
local e1 = world:entity()
local e2 = world:entity()
world:add(e1, Temporary)
world:add(e2, Temporary)
-- Delete the component definition
world:delete(Temporary)
-- Temporary is removed from all entities
assert(not world:has(e1, Temporary))
assert(not world:has(e2, Temporary))
```
## remove
Removes a component from a given entity.
```luau
function World:remove(entity: Entity, component: Id): void
```
### Parameters
| Name | Type | Description |
|------|------|-------------|
| entity | Entity | The entity to modify |
| component | Id | The component or relationship to remove |
### Behavior
1. Invokes any `OnRemove` hook for the component being removed
2. Removes the component from the entity
3. May cause the entity to transition to another archetype
### Example
::: code-group
```luau [luau]
local world = jecs.World.new()
-- Create components
local Health = world:component()
local Shield = world:component()
-- Create an entity with both components
local entity = world:entity()
world:set(entity, Health, 100)
world:set(entity, Shield, 50)
-- Remove just the Shield component
world:remove(entity, Shield)
-- Entity still exists but no longer has Shield
assert(world:contains(entity))
assert(world:has(entity, Health))
assert(not world:has(entity, Shield))
```
```typescript [typescript]
import { World } from "@rbxts/jecs";
const world = new World();
// Create components
const Health = world.component();
const Shield = world.component();
// Create an entity with both components
const entity = world.entity();
world.set(entity, Health, 100);
world.set(entity, Shield, 50);
// Remove just the Shield component
world.remove(entity, Shield);
// Entity still exists but no longer has Shield
assert(world.contains(entity));
assert(world.has(entity, Health));
assert(!world.has(entity, Shield));
```
:::
### Removing Relationships
The `remove` method can also be used to remove relationship pairs:
```luau
local ChildOf = world:component()
local parent = world:entity()
local child = world:entity()
-- Establish parent-child relationship
world:add(child, jecs.pair(ChildOf, parent))
-- Remove the relationship
world:remove(child, jecs.pair(ChildOf, parent))
-- Child is no longer related to parent
assert(not world:has(child, jecs.pair(ChildOf, parent)))
```
## Differences Between delete and remove
| Method | What It Affects | Entity Existence | Cleanup Policies |
|--------|-----------------|------------------|------------------|
| delete | Entity and all its components | Entity no longer exists | Triggers all cleanup policies |
| remove | Only the specified component | Entity still exists | Only triggers component-specific OnRemove hook |
### When to Use Each Method
- Use `delete` when you want to completely remove an entity from the world
- Use `remove` when you want to keep the entity but remove specific components
- Use `delete` on a component definition to remove that component from all entities
### Performance Considerations
Both operations may cause archetype transitions, which have performance implications:
- `delete` typically has more overhead because it has to remove all components
- `remove` is generally faster for individual component removal
- Both methods are optimized in jecs to be as efficient as possible
For performance-critical code dealing with many entities, consider batching operations to minimize archetype transitions.