Skip to content

Gameplay time and phase contract ​

stepFrame is shared by the editor and standalone player. Existing projects keep Update(float dt) and Flow Tick behavior: once per active outer frame, with the clamped game delta supplied by that root. Timed routines use their object's time group, defaulting to the outer gameplay-frame clock; starting one from FixedUpdate does not change its waits to fixed ticks.

FixedUpdate(float dt) is an additive synchronous lifecycle hook. The physics runtime invokes it immediately before each 1/60-second Rapier step, using the existing physics accumulator. There is no second gameplay accumulator. A display frame can run zero, one, or several fixed callbacks. The existing four-step cap continues to discard excessive backlog and reports the discarded duration. Simulation time advances only for completed fixed steps. Paused player/debugger frames do not call the shared pipeline, so they advance neither clock.

A debugger breakpoint in FixedUpdate or a fixed contact hook pauses at the end of its current fixed tick: all objects' fixed callbacks and that tick's physics/contact work finish before the pause takes effect. The debugger displays this committed state. Any remaining catch-up time stays in the physics accumulator; Resume consumes it without replaying callbacks from the completed tick. The remainder of the interrupted outer frame (including Flow Tick and presentation animation) is skipped. This keeps a fixed callback and its physics integration together; ordinary Start and Update breakpoints retain their before-hook suspension.

The live component clock has these phases:

PhaseTiming and authority
updateExisting component Update, Flow Tick, and outer-frame timed routines.
fixedFixedUpdate and physics contact callbacks. FixedUpdate sees the committed body pose; authored body commands, kinematic moves, additions and removals are reconciled before that tick's integration.
presentationMotion, skeleton and rendering passes. Render poses may be interpolated between committed physics poses.

Clock fields are deltaTime, frameTime, frameIndex, simulationTime, simulationTick, fixedDeltaTime, interpolationAlpha, and droppedTime. simulationTime during FixedUpdate is the start time of the pending tick; simulationTick is that tick's one-based index. After physics they describe the completed tick/time. frameTime counts active outer pipeline time, including editor preview work, while simulation time restarts with its physics world. droppedTime is the physics runtime's cumulative backlog diagnostic.

The fixed cohort is the same stable object cohort selected at the outer frame boundary. New objects can acquire bodies and receive commands in that tick, but their FixedUpdate starts in the next outer frame. Removing or replacing an object prevents subsequent callbacks on the retired instance. Disabled components retain their normal lifecycle gate.

Device sources and action maps preserve their existing outer-frame snapshots. Fixed callbacks temporarily read a separate simulation snapshot over the same bindings. Press/release edges survive frames containing zero fixed ticks, appear once on the next fixed tick, and are consumed before a second catch-up tick. A fast press and release remains visible as both edges. Fixed hold/charge/buffer interactions use simulation milliseconds, so debugger/player pauses do not count toward the interaction. A new physics session resets fixed interaction memory.

physicsSimulationPose(thing) returns a copied committed world origin/rotation. Rigid bodies read their live physics pose; soft bodies read the committed particle centroid with the authored-origin offset; bodyless children inherit a physics parent's committed transform. Ordinary presentation transform reads keep their existing meaning outside FixedUpdate.

This is an explicit transition path for existing games, not automatic conversion of all gameplay into deterministic fixed simulation. Authors can move physics or hit-determining logic to FixedUpdate deliberately. Flow Tick, character controllers, animation markers, and existing Update remain on their shipped cadence. Tick-stamped replay tests prove identical fixed input/contact/pose traces at 30, 60, 144 Hz and irregular display pacing; ordinary live input is sampled when delivered, so this is not a promise of cross-platform lockstep networking.