/// <summary>
        /// Runs simulation over a single frame.
        /// This method repeatedly checks for query matches until there are no more to be found.
        /// </summary>
        public void SimulateOneShot()
        {
            if (simulatingTemporal || !TryStartSimulation())
            {
                return;
            }

            OnOneShotSimulationStart?.Invoke();

            // Run database processing jobs
            m_Database.OnMarsUpdate();
            m_ReasoningModule.UpdateReasoningAPIData();

            // We keep running the task loop until it doesn't find any matches.
            // This is to ensure that relations dependent on other entities have a chance to be matched.
            // Ideally we could avoid this by sorting queries based on a dependency graph.
            bool matchFoundThisIteration;

            do
            {
                matchFoundThisIteration = m_QueryBackend.RunAllQueries();
            }while (matchFoundThisIteration);

            StopSimulation();

            // Avoid triggering OnDisable until module unload or the next simulation, so that simulatables keep
            // their state at the end of simulation. We still need to set runInEditMode to false - this happens in
            // a double delay call so that it doesn't interfere with Start, which happens on a delay.
            EditorApplication.delayCall += DelayStopRunningOneShot;
        }