Skip to content


NetworkContext is a CoreObject representing a special folder containing client-only, server-only, or static objects.

They have no properties or functions of their own, but inherit everything from CoreObject.


Function Name Return Type Description Tags
SpawnSharedAsset(string assetId, [table parameters]) CoreObject Spawns an instance of an asset into the world as a child of a networked Static Context, also spawning copies of the asset on clients without the overhead of additional networked objects. Any object spawned this way cannot be modified, as with other objects within a Static Context, but they may be destroyed by calling DestroySharedAsset() on the same NetworkContext instance. Raises an error if called on a non-networked Static Context or a Static Context which is a descendant of a Client Context or Server Context. Optional parameters can specify a transform for the spawned object.
Supported parameters include:
position (Vector3): Position of the spawned object, relative to the parent NetworkContext.
rotation (Rotation or Quaternion): Local rotation of the spawned object.
scale (Vector3 or number): Scale of the spawned object, may be specified as a Vector3 or as a number for uniform scale.
transform (Transform): The full transform of the spawned object. If transform is specified, it is an error to also specify position, rotation, or scale.
DestroySharedAsset(CoreObject coreObject) None Destroys an object that was spawned using SpawnSharedAsset(). Raises an error if coreObject was not created by this NetworkContext. Server-Only


Example using:



When Core Objects are spawned using NetworkContext.SpawnSharedAsset() they use far less networking resources, compared to spawning them with World.SpawnAsset(). On the other hand, objects spawned this way cannot be modified at runtime (only destroyed). In this example the game has no floor. At runtime, cubes are spawned below the players for them to walk on. As players move, the cubes are removed from behind them and added ahead of them. This script is placed in either the server or default context. A Static Context group is added to the hierarchy and has networking enabled on it. The Static Context is assigned to this script as a custom property. Finally, a template of a cube is also assigned as custom property to this script.

local STATIC_CONTEXT = script:GetCustomProperty("StaticContext"):WaitForObject()
local CUBE_TEMPLATE = script:GetCustomProperty("Cube")

-- Can be modified to make grids of different sizes
local CUBE_SCALE = 200

-- Memory of player positions and cube objects
local gridValues = {}
local gridCubes = {}

-- Each frame, check if player positions on the grid have changed
function Tick()
    for _,player in ipairs(Game.GetPlayers()) do
        local pos = player:GetWorldPosition()
        local lastX = player.serverUserData.gridX
        local lastY = player.serverUserData.gridY
        local newX = CoreMath.Round(pos.x / CUBE_SCALE)
        local newY = CoreMath.Round(pos.y / CUBE_SCALE)
        if newX ~= lastX or newY ~= lastY then
            player.serverUserData.gridX = newX
            player.serverUserData.gridY = newY

            for i = -1, 1 do
                for j = -1, 1 do
                    AddAt(newX + i, newY + j)
            if lastX and lastY then
                for i = -1, 1 do
                    for j = -1, 1 do
                        RemoveAt(lastX + i, lastY + j)

-- Try to add a cube at a given position on the floor grid
function AddAt(x, y)
    InitGridAt(x, y)
    gridValues[x][y] = gridValues[x][y] + 1
    if gridValues[x][y] == 1 then
        local cubePosition = Vector3.New(x, y, -0.5) * CUBE_SCALE
        local cubeScale = Vector3.ONE * CUBE_SCALE / 100
        local params = {position = cubePosition, scale = cubeScale}

        -- Spawn
        local cube = STATIC_CONTEXT:SpawnSharedAsset(CUBE_TEMPLATE, params)

        gridCubes[x][y] = cube

-- Try to remove the cube at a given grid position
function RemoveAt(x, y)
    InitGridAt(x, y)
    gridValues[x][y] = gridValues[x][y] - 1
    if gridValues[x][y] == 0 then
        local cube = gridCubes[x][y]
        gridCubes[x][y] = nil

        -- Destroy

-- Make sure the grid is initialized at this position
function InitGridAt(x, y)
    if not gridValues[x] then
        gridValues[x] = {}
        gridValues[x][y] = 0
        gridCubes[x] = {}

    elseif not gridValues[x][y] then
        gridValues[x][y] = 0

See also: Player.serverUserData | Game.GetPlayers | CoreObject.GetCustomProperty | CoreObjectReference.WaitForObject | CoreMath.Round | Vector3.New

Last update: November 29, 2021