AOI (Area of Interest)
AOI (Area of Interest) tracks visibility relationships between entities, commonly used for MMO synchronization and NPC AI perception.
createGridAOI
Section titled “createGridAOI”function createGridAOI<T>(cellSize?: number): GridAOI<T>Creates a grid-based AOI manager.
Parameters:
cellSize- Grid cell size (recommended: 1-2x average view range)
Observer Management
Section titled “Observer Management”addObserver
Section titled “addObserver”Add an observer:
aoi.addObserver(player, position, { viewRange: 200, // View range observable: true // Can be seen by other observers (default true)});
// NPC that only observes but cannot be observedaoi.addObserver(camera, position, { viewRange: 500, observable: false});removeObserver
Section titled “removeObserver”Remove an observer:
aoi.removeObserver(player);updatePosition
Section titled “updatePosition”Update position (automatically triggers enter/exit events):
aoi.updatePosition(player, newPosition);updateViewRange
Section titled “updateViewRange”Update view range:
// View range expanded after buffaoi.updateViewRange(player, 300);Query Methods
Section titled “Query Methods”getEntitiesInView
Section titled “getEntitiesInView”Get all entities within an observer’s view:
const visible = aoi.getEntitiesInView(player);for (const entity of visible) { updateEntityForPlayer(player, entity);}getObserversOf
Section titled “getObserversOf”Get all observers who can see a specific entity:
const observers = aoi.getObserversOf(monster);for (const observer of observers) { notifyMonsterMoved(observer, monster);}canSee
Section titled “canSee”Check visibility:
if (aoi.canSee(player, enemy)) { enemy.showHealthBar();}Event System
Section titled “Event System”Global Event Listener
Section titled “Global Event Listener”aoi.addListener((event) => { switch (event.type) { case 'enter': console.log(`${event.observer} sees ${event.target}`); break; case 'exit': console.log(`${event.target} left ${event.observer}'s view`); break; }});Entity-Specific Event Listener
Section titled “Entity-Specific Event Listener”// Only listen to a specific player's view eventsaoi.addEntityListener(player, (event) => { if (event.type === 'enter') { sendToClient(player, 'entity_enter', event.target); } else if (event.type === 'exit') { sendToClient(player, 'entity_exit', event.target); }});Event Types
Section titled “Event Types”interface IAOIEvent<T> { type: 'enter' | 'exit' | 'update'; observer: T; // Observer (who saw the change) target: T; // Target (object that changed) position: IVector2; // Target position}Blueprint Nodes
Section titled “Blueprint Nodes”GetEntitiesInView- Get entities in viewGetObserversOf- Get observersCanSee- Check visibilityOnEntityEnterView- Enter view eventOnEntityExitView- Exit view event
Service Tokens
Section titled “Service Tokens”For dependency injection scenarios:
import { SpatialIndexToken, SpatialQueryToken, AOIManagerToken, createGridSpatialIndex, createGridAOI} from '@esengine/spatial';
// Register servicesservices.register(SpatialIndexToken, createGridSpatialIndex(100));services.register(AOIManagerToken, createGridAOI(100));
// Get servicesconst spatialIndex = services.get(SpatialIndexToken);const aoiManager = services.get(AOIManagerToken);