Exemple #1
0
    /// <param name="path">The path to wait for. The path must be started, otherwise an exception will be thrown.</param>
    public static void BlockUntilCalculated(Path path)
    {
        if (active == null)
        {
            throw new System.Exception("Pathfinding is not correctly initialized in this scene (yet?). " +
                                       "AstarPath.active is null.\nDo not call this function in Awake");
        }

        if (path == null)
        {
            throw new System.ArgumentNullException("Path must not be null");
        }

        if (active.pathProcessor.queue.IsTerminating)
        {
            return;
        }

        if (path.PipelineState == PathState.Created)
        {
            throw new System.Exception("The specified path has not been started yet.");
        }

        waitForPathDepth++;

        if (waitForPathDepth == 5)
        {
            Debug.LogError("You are calling the BlockUntilCalculated function recursively (maybe from a path callback). Please don't do this.");
        }

        if (path.PipelineState < PathState.ReturnQueue)
        {
            if (active.IsUsingMultithreading)
            {
                while (path.PipelineState < PathState.ReturnQueue)
                {
                    if (active.pathProcessor.queue.IsTerminating)
                    {
                        waitForPathDepth--;
                        throw new System.Exception("Pathfinding Threads seem to have crashed.");
                    }

                    // Wait for threads to calculate paths
                    Thread.Sleep(1);
                    active.PerformBlockingActions(true);
                }
            }
            else
            {
                while (path.PipelineState < PathState.ReturnQueue)
                {
                    if (active.pathProcessor.queue.IsEmpty && path.PipelineState != PathState.Processing)
                    {
                        waitForPathDepth--;
                        throw new System.Exception("Critical error. Path Queue is empty but the path state is '" + path.PipelineState + "'");
                    }

                    // Calculate some paths
                    active.pathProcessor.TickNonMultithreaded();
                    active.PerformBlockingActions(true);
                }
            }
        }

        active.pathReturnQueue.ReturnPaths(false);
        waitForPathDepth--;
    }