public static void Initialize(string worldName, bool editorWorld)
    {
        PlayerLoopManager.RegisterDomainUnload(DomainUnloadShutdown, 10000);

        var world = new World(worldName);

        World.Active = world;
        var systems = GetAllSystems(WorldSystemFilterFlags.Default);

        if (systems == null)
        {
            world.Dispose();
            if (World.Active == world)
            {
                World.Active = null;
            }
            return;
        }

        // create presentation system and simulation system
        InitializationSystemGroup initializationSystemGroup = world.GetOrCreateSystem <InitializationSystemGroup>();
        SimulationSystemGroup     simulationSystemGroup     = world.GetOrCreateSystem <SimulationSystemGroup>();
        PresentationSystemGroup   presentationSystemGroup   = world.GetOrCreateSystem <PresentationSystemGroup>();

        // Add systems to their groups, based on the [UpdateInGroup] attribute.
        foreach (var type in systems)
        {
            // Skip the built-in root-level systems
            if (type == typeof(InitializationSystemGroup) ||
                type == typeof(SimulationSystemGroup) ||
                type == typeof(PresentationSystemGroup))
            {
                continue;
            }
            if (editorWorld)
            {
                if (Attribute.IsDefined(type, typeof(ExecuteInEditMode)))
                {
                    Debug.LogError(
                        $"{type} is decorated with {typeof(ExecuteInEditMode)}. Support for this attribute will be deprecated. Please use {typeof(ExecuteAlways)} instead.");
                }
                if (!Attribute.IsDefined(type, typeof(ExecuteAlways)))
                {
                    continue;
                }
            }

            var groups = type.GetCustomAttributes(typeof(UpdateInGroupAttribute), true);
            if (groups.Length == 0)
            {
                simulationSystemGroup.AddSystemToUpdateList(GetOrCreateManagerAndLogException(world, type) as ComponentSystemBase);
            }

            foreach (var g in groups)
            {
                var group = g as UpdateInGroupAttribute;
                if (group == null)
                {
                    continue;
                }

                if (!(typeof(ComponentSystemGroup)).IsAssignableFrom(group.GroupType))
                {
                    Debug.LogError($"Invalid [UpdateInGroup] attribute for {type}: {group.GroupType} must be derived from ComponentSystemGroup.");
                    continue;
                }

                var groupMgr = GetOrCreateManagerAndLogException(world, group.GroupType);
                if (groupMgr == null)
                {
                    Debug.LogWarning(
                        $"Skipping creation of {type} due to errors creating the group {group.GroupType}. Fix these errors before continuing.");
                    continue;
                }
                var groupSys = groupMgr as ComponentSystemGroup;
                if (groupSys != null)
                {
                    groupSys.AddSystemToUpdateList(GetOrCreateManagerAndLogException(world, type) as ComponentSystemBase);
                }
            }
        }

        // Update player loop
        initializationSystemGroup.SortSystemUpdateList();
        simulationSystemGroup.SortSystemUpdateList();
        presentationSystemGroup.SortSystemUpdateList();
        ScriptBehaviourUpdateOrder.UpdatePlayerLoop(world);
    }