@web-engine-dev/prefab
Reusable entity templates (prefabs) for game engines. Supports variants, nesting, and runtime modification.
Features
- Entity Templates: Reusable entity definitions
- Variants: Override properties from base prefab
- Nesting: Prefabs containing other prefabs
- Runtime Override: Modify instances at runtime
- Hot Reload: Update prefabs during development
Installation
bash
npm install @web-engine-dev/prefab
# or
pnpm add @web-engine-dev/prefabQuick Start
typescript
import { PrefabManager, Prefab } from '@web-engine-dev/prefab';
// Create prefab manager
const prefabs = new PrefabManager(world);
// Register prefab
prefabs.register('enemy', {
components: {
Transform: { x: 0, y: 0 },
Sprite: { texture: 'enemy.png' },
Health: { value: 100 },
AI: { behavior: 'patrol' },
},
});
// Instantiate
const enemy = prefabs.instantiate('enemy', {
Transform: { x: 100, y: 50 },
});API Overview
Prefab Definition
typescript
const playerPrefab = {
name: 'Player',
components: {
Transform: { x: 0, y: 0 },
Sprite: { texture: 'player.png' },
Health: { value: 100, max: 100 },
Movement: { speed: 5 },
},
children: [
{
name: 'Weapon',
components: {
Transform: { x: 10, y: 0 },
Sprite: { texture: 'sword.png' },
},
},
],
};Variants
typescript
// Base enemy
prefabs.register('enemy', {
/* ... */
});
// Variant - stronger enemy
prefabs.registerVariant('strong_enemy', 'enemy', {
overrides: {
Health: { value: 200 },
Sprite: { texture: 'strong_enemy.png' },
},
});
// Instantiate variant
prefabs.instantiate('strong_enemy');Runtime Override
typescript
const entity = prefabs.instantiate('enemy', {
// Override specific properties
Transform: { x: 100, y: 200 },
Health: { value: 50 }, // Damaged enemy
});Nested Prefabs
typescript
prefabs.register('tank', {
components: {
Transform: {},
Sprite: { texture: 'tank_body.png' },
},
children: [
{
prefab: 'turret', // Reference another prefab
overrides: {
Transform: { x: 0, y: -5 },
},
},
],
});Loading from Files
typescript
// Load prefab from JSON
await prefabs.load('prefabs/player.json');
// Load directory
await prefabs.loadDirectory('prefabs/');