public void FixedUpdate()
    {
        if (resetSpawns)
        {
            ResetObjects();
        }
        else if (WorkerTokenSource.IsCancellationRequested)
        {
            WorkerTokenSource = new System.Threading.CancellationTokenSource();
        }
        else
        {
            if (workers.Count(i => ExtensionSingletons.Where(j => j.GetType().IsAssignableFrom(i.Key)).First().isStarted) > 0)
            {
                StartCoroutine("StartWorkers");
            }


            if (mainThreadActions.Count() > 0)
            {
                lock (mainThreadActions)
                {
                    System.Action act = mainThreadActions.FirstOrDefault();
                    if (act != null)
                    {
                        act.Invoke();
                        mainThreadActions.RemoveAt(0);
                    }
                }
            }
        }
    }
    public void ResetObjects()
    {
        foreach (Transform child in this.transform)
        {
            Destroy(child.gameObject);
        }

        resetSpawns = false;
        WorkerTokenSource.Cancel();
        mainThreadActions.Clear();
        ExtensionSingletons.ForEach(s => s.isStarted = false);
        foreach (ExtensionField field in fields)
        {
            if (field.enabled)
            {
                CreateInstance(field);
            }
        }
    }
    private void CreateInstance(ExtensionField field)
    {
        if (field.targetType == null)
        {
            UnityEngine.Debug.Log($"[Area::{this.name}]: Unable to load extesion type of \"{field.targetType}\".");
            return;
        }

        ExtensionBase extensionInstance = ExtensionSingletons
                                          .Where(t => t.GetType().IsAssignableFrom(field.targetType))
                                          .FirstOrDefault();

        if (extensionInstance == null)
        {
            extensionInstance = (ExtensionBase)System.Activator.CreateInstance(field.targetType);
            ExtensionSingletons.Add(extensionInstance);
        }

        System.Threading.CancellationToken token = WorkerTokenSource.Token;
        workers[field.targetType] = extensionInstance.GetWorker(token, this);
    }