View Culling (Client LOD)
Client-side distance tiers over entity views: full detail near, animator pose-write culling in the mid ring, deactivation beyond. Whatever the game spawns gets culled and the layer never knows what the objects are. No server half and no wire — usable on its own, including by a client that only moves a camera.
Unity seams you implement 2
The client half's sockets. Bind your implementation in the client context and Crossplay's client calls it — this is where your models, animators, UI and controls plug in.
ICullingClient unity SPI
The client culling layer: assigns every world entity view a distance tier from the local player and (by default) applies the built-in actions — full detail near, animator pose-write culling in the mid ring, deactivation beyond. It never knows what a view IS; whatever the game spawns gets culled. Remove the package (or disable it in options) and every view stays full detail.
-
event Action<WorldEntityView, int> TierChangedA view moved to another tier (see CullingTier). Games hook their own LOD reactions here.
-
int CountFullViews currently at full detail.
-
int CountReducedViews currently in the reduced ring.
-
int CountCulledViews currently culled (deactivated).
ICullingOrigin unity SPI
OPTIONAL seam: where the culling layer measures distance FROM. Unbound (the default), the origin is the local player's own avatar transform, exactly as it has always been. Bind it when the local player's viewpoint is not where their own avatar's transform is — a seated driver whose avatar is parked while the vehicle they steer travels (CNC-07), a spectator following another entity, a camera-led strategy view. Returning false hands the origin back to the avatar for that scan, so an implementation only answers while its situation holds. Consulted once per scan (ScanIntervalSeconds), never per view; an implementation must not allocate.
-
bool TryGetOrigin(out Vector3 origin)The point to measure tiers from right now, when this source has one.