/// Loads neighbor scenes within maxNeighborDistance, adding them to the near list.
    private void LoadNeighbors(string sceneName, int distance)
    {
        if (near.Contains(sceneName))
        {
            return;
        }
        near.Add(sceneName);
        if (distance >= maxNeighborDistance)
        {
            return;
        }
        GameObject        scene             = GameObject.Find(sceneName);
        NeighboringScenes neighboringScenes = (scene) ? scene.GetComponent <NeighboringScenes>() : null;

        if (!neighboringScenes)
        {
            neighboringScenes = CreateNeighboringScenesList(scene);
        }
        if (!neighboringScenes)
        {
            return;
        }
        for (int i = 0; i < neighboringScenes.sceneNames.Length; i++)
        {
            Load(neighboringScenes.sceneNames[i], LoadNeighbors, distance + 1);
        }
    }
    /// Creates the neighboring scenes list. It's faster to manually add a
    /// NeighboringScenes script to your scene's root object; this method
    /// builds it manually if it's missing, but requires the scene to have
    /// SceneEdge components.
    private NeighboringScenes CreateNeighboringScenesList(GameObject scene)
    {
        if (!scene)
        {
            return(null);
        }
        NeighboringScenes neighboringScenes = scene.AddComponent <NeighboringScenes>();
        HashSet <string>  neighbors         = new HashSet <string>();
        var sceneEdges = scene.GetComponentsInChildren <SceneEdge>();

        for (int i = 0; i < sceneEdges.Length; i++)
        {
            neighbors.Add(sceneEdges[i].nextSceneName);
        }

        neighboringScenes.sceneNames = new string[neighbors.Count];
        neighbors.CopyTo(neighboringScenes.sceneNames);
        return(neighboringScenes);
    }