Skip to content

@web-engine-dev/scripting

Runtime scripting layer for gameplay logic with lifecycle hooks. Provides a Unity MonoBehaviour-like API for creating game behaviors.

Features

  • Script Lifecycle: onStart, onUpdate, onFixedUpdate, onLateUpdate, onDestroy
  • Script Registry: Type-safe registration and instantiation
  • Entity Binding: Attach scripts to entities
  • Error Handling: Graceful error recovery
  • Events: Subscribe to script lifecycle events

Installation

bash
npm install @web-engine-dev/scripting
# or
pnpm add @web-engine-dev/scripting

Quick Start

typescript
import {
  Script,
  ScriptContext,
  defineScript,
  ScriptManager,
  createScriptTypeId,
} from '@web-engine-dev/scripting';

// Define a script
class PlayerController implements Script {
  readonly typeId = createScriptTypeId('PlayerController');
  readonly instanceId = 0 as any;
  enabled = true;

  speed = 5;

  onStart(context: ScriptContext) {
    console.log('Player initialized');
  }

  onUpdate(context: ScriptContext) {
    const movement = this.speed * context.deltaTime;
    // Apply movement
  }

  onDestroy(context: ScriptContext) {
    console.log('Player destroyed');
  }
}

// Register the script
defineScript('PlayerController', PlayerController, {
  name: 'Player Controller',
  category: 'Character',
  tags: ['player', 'movement'],
});

// Use in game loop
const manager = new ScriptManager();
const entity = { id: 1 };

const script = manager.attach(entity, createScriptTypeId('PlayerController'));

API Reference

Script Interface

MethodDescription
onStart(ctx)Called once when script starts
onUpdate(ctx)Called every frame
onFixedUpdateCalled at fixed timestep
onLateUpdateCalled after all updates
onDestroy(ctx)Called when script is destroyed

ScriptContext

PropertyDescription
deltaTimeTime since last update
timeTotal elapsed time
entityAttached entity

ScriptManager

MethodDescription
attach(entity, type)Attach script to entity
detach(script)Remove script from entity
processStart(dt, t)Call onStart for new scripts
update(dt, t)Call onUpdate
fixedUpdate(dt, t)Call onFixedUpdate
lateUpdate(dt, t)Call onLateUpdate

Decorator Registration

typescript
import { RegisterScript } from '@web-engine-dev/scripting';

@RegisterScript({
  typeId: 'EnemyAI',
  name: 'Enemy AI',
  category: 'AI',
})
class EnemyAI implements Script {
  // ...
}

Game Loop Integration

typescript
const manager = new ScriptManager();

function gameLoop(deltaTime: number, time: number) {
  // Process newly attached scripts
  manager.processStart(deltaTime, time);

  // Main updates
  manager.update(deltaTime, time);

  // Physics updates (in fixed loop)
  manager.fixedUpdate(fixedDeltaTime, time);

  // Late updates (after physics)
  manager.lateUpdate(deltaTime, time);
}

Proprietary software. All rights reserved.