Skip to content

Entity Type ​

Tags an entity with the kind it was created from (cube, sphere, model, directionalLight, etc.). Factories use this to drive kind-specific behavior; the editor inspector uses it to select component editors.

Properties ​

PropertyTypeDescription
valueEcsEntityKind | EcsEntityEditorKindKind tag identifying which factory created this entity (e.g. cube, directionalLight, model).

API reference ​

Scripting examples ​

Component access patterns

Use this.getComponent(X) to access a component on the entity this script is attached to. Use this.world.getEntityByName to find another entity by name, then this.world.getComponent to read its component:

typescript
// Component on the entity this script is on
const type = this.getComponent(EntityType);

// Component on another entity, found by its scene name
const other = this.world.getEntityByName("Enemy");
if (other) {
  const type = this.world.getComponent(other.entityId, EntityType);
}

Read the entity's own type tag ​

Branch behaviour based on what kind of entity this script is attached to.

typescript
import { Behaviour } from "@relu-interactives/spatial-ecs";
import { EntityType } from "@relu-interactives/spatial-ecs/components";

export default class TypeAwareSetup extends Behaviour {
  protected init() {
    const entityType = this.getComponent(EntityType);
    if (!entityType) return;

    if (entityType.value === "cube") {
      // Run cube-specific logic
      this.transform.scale.x = 2;
    } else if (entityType.value === "sphere") {
      // Run sphere-specific logic
      this.transform.scale.x = 1.5;
    }
  }
}

Filter a world query by entity kind ​

Iterate all entities in the scene and apply logic only to those of a specific type.

typescript
import { Behaviour } from "@relu-interactives/spatial-ecs";
import { EntityType, TransformComponent } from "@relu-interactives/spatial-ecs/components";
import type { TextInput, FloatInput } from "@relu-interactives/spatial-ecs";

export default class TypeFilter extends Behaviour {
  data = {
    targetKind: "cube" as TextInput,
    spinSpeed: 1 as FloatInput,
  };

  protected onUpdate() {
    for (const id of this.world.query(EntityType)) {
      const entityType = this.world.getComponent(id, EntityType);
      if (entityType?.value !== this.data.targetKind) continue;

      const t = this.world.getComponent(id, TransformComponent);
      if (t) t.rotation.y += this.data.spinSpeed * this.deltaTime;
    }
  }
}

Read-only tag

EntityType.value is set by the factory that created the entity and should be treated as read-only. Do not mutate it at runtime — it is used by the editor inspector and by hydration to select the correct component editors and restore the correct factory state.

Via ComponentInput in the inspector ​

You can also pick this component from the inspector using a ComponentInput field. Assign any entity in the inspector and the field resolves to the live EntityType instance at runtime.

typescript
import {
  Behaviour,
  type ComponentInput,
} from "@relu-interactives/spatial-ecs";
import {
  EntityType,
} from "@relu-interactives/spatial-ecs/components";

export default class Example extends Behaviour {
  data = {
    targetEntityType: {
      type: "component",
      value: null,
    } as unknown as ComponentInput,
  };

  protected onUpdate() {
    const entityType = this.data.targetEntityType.value as EntityType | null;
    if (!entityType) return;
    // Use the live component instance.
  }
}

Via EntityInput in the inspector ​

Alternatively, pick an entity from the inspector using an EntityInput field and then read the component off that entity via world.getComponent:

typescript
import {
  Behaviour,
  type EntityInput,
  type WorldEntityView,
} from "@relu-interactives/spatial-ecs";
import {
  EntityType,
} from "@relu-interactives/spatial-ecs/components";

export default class Example extends Behaviour {
  data = {
    targetEntity: { type: "entity", value: null } as unknown as EntityInput,
  };

  protected onUpdate() {
    const entity = this.data.targetEntity.value as WorldEntityView | null;
    if (!entity) return;

    const entityType = this.world.getComponent(
      entity.entityId,
      EntityType,
    ) as EntityType | null;
    if (!entityType) return;
    // Use the component on the picked entity.
  }
}