autoCleanup on Behaviour β register disposables or cleanup functions tied to the component lifecycle. Automatically cleaned up on disable or destroy depending on when registered:
PlayableDirector: expose tracks and activationTracks getters, support runtime playableAsset assignment with automatic graph rebuild
PhysicsCollider: expose density property, add @validate decorator for automatic property updates at runtime
Timeline AudioTrack volume getter/setter
Networking: beginListen now returns an unsubscribe function (backwards compatible β stopListen still works):
const unsub = this.context.connection.beginListen("my-event", (data) => { ... });
unsub(); // or use this.autoCleanup(unsub)
Changed
Serialization: consolidated instantiate reference resolution into a unified system β fixes cloned timelines, EventLists, SignalReceivers, and deep component references not resolving correctly after instantiate()
Context.events β typed event bus for decoupled component communication. Known events get autocomplete; custom events can be typed at the call site:
context.events.on("scene-content-changed", e => console.log(e.object));
context.events.emit<{ pts: number }>("scored", { pts: 10 });
ContactShadows auto-refit β when autoFit is enabled, shadows automatically refit when scene content changes (e.g. SceneSwitcher load, DropListener asset loading)
Input.addEventListener now returns an unsubscribe function (works with autoCleanup):
AnimationBuilder β low-level API for defining animation tracks with typed keyframes and tween shorthands. Used by AnimatorControllerBuilder and TimelineBuilder for inline .track() calls
TimelineBuilder typed track builder interfaces per track type (AnimationTrackBuilder, AudioTrackBuilder, etc.) with inline .track() support for keyframe animation
AnimatorControllerBuilder: inline .track() for defining animation directly on states, support for TrackDescriptor arrays as clip sources, simplified exitTime (replaces separate hasExitTime flag)
Physics raycast includeTriggers option β opt-in to hitting trigger/sensor colliders (skipped by default)
OrbitControls.fitCamera deprecated overload removed from type declarations (runtime still accepts Object3D for backwards compat β use fitCamera({ objects: [...] }) instead)
Fixed
OrbitControls: programmatic camera transitions (e.g. fitCamera) no longer interrupted continuously during an ongoing drag β only at interaction start
fitCamera with centerCamera: "y" producing incorrect camera elevation when camera was above the scene center
Animator: switching runtimeAnimatorController now properly disposes the previous controller
AnimatorController.dispose() guard against missing mixer
Add: AudioSource now accepts .opus clip URLs β in preparation for upcoming automatic .wav β .opus compression for much smaller, faster-loading audio by default
Add: ?stats URL parameter now also logs renderer info (DPR, antialias, MSAA samples, drawing buffer resolution)
Unity Integration
Bump: @needle-tools/gltf-build-pipeline to 2.15.12 β adds material-only GLB processing
Major DragControls upgrade β new constraint system with scale limits, refined regions, and a dedicated AR drag mode
Updated MaterialX runtime with faster environment lighting and PMREM support
Updated Unity build pipeline with WAV audio and HDRi (FASTHDR) compression
Needle Engine
Added
DragControls received a substantial round of improvements with a new constraint system, including a keepScale option, a two-touch scale constraint with min/max limits, refined hit regions, and a dedicated screen-space AR drag mode
Skybox: new background-rotation and environment-rotation HTML attributes, plus background-image-loaded and environment-image-loaded events to react to skybox load completion
Input: input cancellation support (e.g. when a pointer is disconnected mid-interaction)
loadPMREM: auto-detects image format for extensionless URLs
AudioSource: .opus clip URLs are now supported
GroundProjectionEnv.applyOnAwake now defaults to true, matching Unity and Blender behaviour
Changed
OrbitControls: lockLookAtTarget now preserves the pointer target when double-clicking to focus
PostProcessing: pixelation granularity adapts dynamically to device pixel ratio
DragControls: rotation is now limited to two-touch and XR controller input for more predictable single-touch dragging
Hardened internal logging: secrets (API keys, tokens, JWTs, PEM keys, URL credentials, β¦) are now redacted before logs are written to disk β a defensive measure so log files shared during debugging never leak credentials
Fixed
DragControls: improved reliability across snap points, screen-space AR drag mode, double-click handling, XZPlane side-view and Y-axis behaviour, multi-input rotation, and touch handover (NE-4418, NE-5413, NE-5887, NE-5891)
Camera: improved fallback camera and CameraUtils lifecycle handling, and fitCamera stability when meshes are parented to the target camera
Context.clear() now resets mainCamera and fallbackCamera so they always point at live cameras after a scene wipe
Skybox: more efficient attribute handling β load cycles are deduplicated, background-intensity is honoured, and magic-name skyboxes resolve correctly when attributes are set at mount time
VideoPlayer.isPlaying now reports streamed sources and file playback independently and correctly
DropListener: loadFromFile now always resolves
Progressive LOD: more reliable instancing, request scheduling, vertex count handling, texture LOD tracking, and disposal lifecycle
VoIP: better mic stream handling on iOS, accurate setMuted for incoming streams, clamped volume, shared AudioContext, and coalesced concurrent connect() calls
Custom model loaders: MIME type check moved earlier so custom loaders reliably take over
General reliability improvements across webmanifest handling, dependency watcher, DTS generation, AI helper install, and file logger
MaterialX
Updated bundled MaterialX runtime to 1.7.0 with faster environment lighting (new radiance sampling modes, PMREM support), better integration with Three.js (texture sampling, environment rotation, alpha modes), and overall performance improvements
Unity: MaterialX export in Needle Engine projects no longer requires a PRO license
Unity Integration
Updated to @needle-tools/gltf-build-pipeline 3.0 β a major version bump that adds WAV audio compression and HDRi β PMREM (FASTHDR) compression to the build pipeline
Updated to needle-cloud CLI version 2 with security hardening
Add: context menu action to compress the output directory (required when a scene uses SceneSwitcher with dependencies)