/** Updates graphs and checks if all nodes are still reachable from each other. * Graphs are updated, then a check is made to see if the nodes are still reachable from each other. * If they are not, the graphs are reverted to before the update and \a false is returned. * This is slower than a normal graph update. * All queued graph updates and thread safe callbacks will be flushed during this function. * * \note This might return true for small areas even if there is no possible path if AstarPath.minAreaSize is greater than zero (0). * So when using this, it is recommended to set AstarPath.minAreaSize to 0. (A* Inspector -> Settings -> Pathfinding) * * \param guo The GraphUpdateObject to update the graphs with * \param nodes Nodes which should have valid paths between them. All nodes should be walkable or \a false will be returned. * \param alwaysRevert If true, revert the graphs even though no blocking ocurred */ public static bool UpdateGraphsNoBlock(GraphUpdateObject guo, List <Node> nodes, bool alwaysRevert = false) { //Make sure all nodes are walkable for (int i = 0; i < nodes.Count; i++) { if (!nodes[i].walkable) { return(false); } } //Track changed nodes to enable reversion of the guo guo.trackChangedNodes = true; bool worked = true; AstarPath.RegisterSafeUpdate(delegate() { AstarPath.active.UpdateGraphs(guo); //Make sure graph updates are registered for update and not delayed for performance AstarPath.active.QueueGraphUpdates(); //Call thread safe callbacks, includes graph updates AstarPath.ForceCallThreadSafeCallbacks(); //Check if all nodes are in the same area and that they are walkable, i.e that there are paths between all of them worked = worked && IsPathPossible(nodes); //If it did not work, revert the GUO if (!worked || alwaysRevert) { guo.RevertFromBackup(); //The revert operation does not revert ALL nodes' area values, so we must flood fill again AstarPath.active.FloodFill(); } }, true); //Force the thread safe callback to be called AstarPath.active.FlushThreadSafeCallbacks(); //Disable tracking nodes, not strictly necessary, but will slightly reduce the cance that some user causes errors guo.trackChangedNodes = false; return(worked); }