Needle Engine Documentation
Getting Started
Tutorials
How-To Guides
Explanation
Reference
Help
Getting Started
Tutorials
How-To Guides
Explanation
Reference
Help

Component Lifecycle Methods

Complete reference for all lifecycle methods available in Needle Engine components.

Performance Best Practice

Only implement lifecycle methods you actually need. Empty update() loops on many components hurt performance!


Lifecycle Methods

Lifecycle methods are only called if declared. Don't add empty methods!

MethodWhen CalledUse For
awake()Component createdInitial setup, references
onEnable()Component enabledSubscribe to events
start()First frame after creationInitialization logic
earlyUpdate()Before default updatePre-update calculations
update()Every frameMain logic loop
lateUpdate()After all updatesFollow cameras, final adjustments
onBeforeRender()Just before renderLast-minute visual updates
onAfterRender()After renderPost-processing logic
onDisable()Component disabledUnsubscribe from events
onDestroy()Component/Object destroyedCleanup resources

Method Details

awake()

Called: When component is first created (before start())

Use for:

  • Setting up references
  • Initializing variables
  • Finding other components

Example:

awake() {
    this.renderer = this.gameObject.getComponent(Renderer);
}

onEnable()

Called: When component is enabled or re-enabled

Use for:

  • Subscribing to events
  • Starting processes
  • Resetting state

Example:

onEnable() {
    this.context.input.addEventListener(InputEvents.PointerDown, this.onPointerDown);
}

start()

Called: First frame after component creation (after awake(), after all awake() calls)

Use for:

  • Initialization that depends on other components
  • Starting coroutines
  • Initial state setup

Example:

start() {
    this.startCoroutine(this.myRoutine());
    console.log("Component initialized");
}

earlyUpdate()

Called: Before update(), every frame

Use for:

  • Pre-update calculations
  • Input processing before main logic

Example:

earlyUpdate() {
    this.processInput();
}

update()

Called: Every frame (main update loop)

Use for:

  • Game logic
  • Movement
  • Animation
  • State updates

Example:

update() {
    this.gameObject.position.x += this.speed * this.context.time.deltaTime;
}

lateUpdate()

Called: After all update() calls, before render

Use for:

  • Camera following
  • Final position adjustments
  • Calculations that depend on other objects' updates

Example:

lateUpdate() {
    // Make camera follow player (after player has moved)
    this.gameObject.position.copy(this.target.position);
}

onBeforeRender()

Called: Just before the frame is rendered

Use for:

  • Last-minute visual updates
  • Shader parameter updates
  • Material property changes

Example:

onBeforeRender() {
    this.material.opacity = this.calculateOpacity();
}

onAfterRender()

Called: After the frame is rendered

Use for:

  • Post-processing logic
  • Statistics gathering
  • Frame cleanup

Example:

onAfterRender() {
    this.frameCount++;
}

onDisable()

Called: When component is disabled

Use for:

  • Unsubscribing from events
  • Stopping processes
  • Cleanup (temporary)

Example:

onDisable() {
    this.context.input.removeEventListener(InputEvents.PointerDown, this.onPointerDown);
    this.stopAllCoroutines();
}

onDestroy()

Called: When component or its GameObject is destroyed

Use for:

  • Final cleanup
  • Resource disposal
  • Removing global references

Example:

onDestroy() {
    this.disposeResources();
}

Execution Order

1. awake()           // All components
2. onEnable()        // All components
3. start()           // All components (first frame only)
4. earlyUpdate()     // Every frame
5. update()          // Every frame
6. lateUpdate()      // Every frame
7. onBeforeRender()  // Every frame
8. [RENDER]
9. onAfterRender()   // Every frame

When disabling:

onDisable()

When destroying:

onDisable()
onDestroy()

Best Practices

✅ DO

  • Only implement methods you need
  • Cache component references in awake() or start()
  • Use deltaTime for frame-rate independent movement
  • Unsubscribe from events in onDisable()
  • Clean up resources in onDestroy()

❌ DON'T

  • Don't add empty update() methods
  • Don't search for components every frame (use findObjectOfType sparingly)
  • Don't forget to unsubscribe from events
  • Don't do heavy calculations in update() without optimization

Related

  • Physics Events - Collision and trigger events
  • Input Events - User input handling
  • XR Events - WebXR-specific events
  • Lifecycle Hooks - Global hooks
  • Time API - Accessing time and deltaTime
Suggest changes
Last Updated: 1/27/26, 6:44 PM

On this page

Extras

Copy for AI (LLMs)