menu_bookDocumentation

Network Visibility: Culling and INetworkVisible Interface

calendar_today May 20, 2026 schedule ~1 min read person PatrickJr verified 50

Network Visibility controls whether a networked object sends updates (Sync Vars, Transform) to a specific player. By default, all networked objects always transmit to all connections.

Always Transmit (Default)

Every networked object has AlwaysTransmit = true by default. The object is visible to every player and never culled.

Custom Visibility with INetworkVisible

Implement Component.INetworkVisible on the root GameObject to control per-connection visibility:

CSHARP
public class MyVisibility : Component, Component.INetworkVisible
{
    public bool IsVisibleToConnection( Connection connection, in BBox worldBounds )
    {
        // Example: only visible within 5000 units
        var playerPos = connection.GameObject?.WorldPosition ?? Vector3.Zero;
        return worldBounds.Center.Distance( playerPos ) < 5000f;
    }
}

Only the owner decides visibility. Disable AlwaysTransmit on the root network object to enable this.

Hammer PVS Fallback

If no INetworkVisible component exists and the map is a Hammer map with VIS compiled, the engine automatically uses PVS (Potentially Visible Set) for visibility.

What Happens When Culled

When an object is NOT visible to a connection:

Stops being sent:
  • Sync Var updates
  • Transform updates
Still occurs:
  • Object still spawns for the client
  • Object becomes Disabled locally while hidden
  • RPCs are still delivered
Invisible objects remain known to the client, just not updated.
Was this helpful?