/// <summary>
    /// Handles cleaning up a known mesh or moving it to the RemovedMeshObjects list
    ///
    /// If NumUpdatesBeforeRemoval < 1, the mesh will immediately be destroyed upon removal
    /// Else we will create a new RemoveSurfaceHolder and add that to the RemovedMeshObjects list to cache the mesh until we believe it should actually be removed
    /// </summary>
    /// <param name="surfaceId"></param>
    protected virtual void HandleDelete(SurfaceId surfaceId)
    {
        GameObject obj = SpatialMeshObjects[surfaceId];

        SpatialMeshObjects.Remove(surfaceId);

        if (NumUpdatesBeforeRemoval < 1)
        {
            FinalDestroy(obj);
        }
        else if (obj != null)
        {
            bool shouldDisable = !ShouldBeActiveWhileRemoved(obj);

            MeshCollider collider          = obj.GetComponent <MeshCollider>();
            bool         collisionsEnabled = (collider != null && collider.enabled);
            if (collisionsEnabled && shouldDisable)
            {
                collider.enabled = false;
            }

            MeshRenderer mr = obj.GetComponent <MeshRenderer>();
            bool         rendererEnabled = (mr != null && mr.enabled);
            if (rendererEnabled && shouldDisable)
            {
                mr.enabled = false;
            }
            RemovedSurfaceHolder holder = new RemovedSurfaceHolder(NumUpdatesBeforeRemoval + 1 /*+1 because we are going to process it now*/, obj, surfaceId, collisionsEnabled, rendererEnabled);
            RemovedMeshObjects.Add(surfaceId, holder);
        }
    }
    /// <summary>
    /// Handles cleaning up a known mesh or moving it to the RemovedMeshObjects list
    /// 
    /// If NumUpdatesBeforeRemoval < 1, the mesh will immediately be destroyed upon removal
    /// Else we will create a new RemoveSurfaceHolder and add that to the RemovedMeshObjects list to cache the mesh until we believe it should actually be removed
    /// </summary>
    /// <param name="surfaceId"></param>
    protected virtual void HandleDelete(SurfaceId surfaceId)
    {
        GameObject obj = SpatialMeshObjects[surfaceId];
        SpatialMeshObjects.Remove(surfaceId);

        if (NumUpdatesBeforeRemoval < 1)
        {
            FinalDestroy(obj);
        }
        else if (obj != null)
        {
            bool shouldDisable = !ShouldBeActiveWhileRemoved(obj);

            MeshCollider collider = obj.GetComponent<MeshCollider>();
            bool collisionsEnabled = (collider != null && collider.enabled);
            if (collisionsEnabled && shouldDisable)
            {
                collider.enabled = false;
            }

            MeshRenderer mr = obj.GetComponent<MeshRenderer>();
            bool rendererEnabled = (mr != null && mr.enabled);
            if (rendererEnabled && shouldDisable)
            {
                mr.enabled = false;
            }
            RemovedSurfaceHolder holder = new RemovedSurfaceHolder(NumUpdatesBeforeRemoval + 1 /*+1 because we are going to process it now*/, obj, surfaceId, collisionsEnabled, rendererEnabled);
            RemovedMeshObjects.Add(surfaceId, holder);
        }
    }