public static bool TraverseSceneGameObjects(Scene scene, bool skipCleanPrefabInstances, GameObjectTraverseCallback callback) { var rootObjects = scene.GetRootGameObjects(); var rootObjectsCount = rootObjects.Length; var objectTraverseInfo = new ObjectTraverseInfo(skipCleanPrefabInstances, rootObjectsCount); for (var i = 0; i < rootObjectsCount; i++) { var rootObject = rootObjects[i]; objectTraverseInfo.current = rootObject; objectTraverseInfo.rootIndex = i; if (!TraverseGameObjectTree(objectTraverseInfo, callback)) { return(false); } } return(true); }
public static bool TraverseGameObjectTree(ObjectTraverseInfo traverseInfo, GameObjectTraverseCallback callback) { Stats.gameObjectsTraversed++; var prefabInstanceRoot = false; if (!traverseInfo.inPrefabInstance) { //Debug.Log("IsPartOfPrefabInstance " + PrefabUtility.IsPartOfPrefabInstance(componentOrGameObject)); //Debug.Log(traverseInfo.current.name); traverseInfo.inPrefabInstance = CSPrefabTools.IsInstance(traverseInfo.current); if (traverseInfo.inPrefabInstance) { if (!CSPrefabTools.IsMissingPrefabInstance(traverseInfo.current)) { if (traverseInfo.SkipCleanPrefabInstances) { if (CSPrefabTools.IsWholeInstanceHasAnyOverrides(traverseInfo.current)) { CSPrefabTools.GetOverridenObjectsFromWholePrefabInstance(traverseInfo.current, out traverseInfo.dirtyComponents); } } } else { traverseInfo.inMissingPrefabInstance = true; } prefabInstanceRoot = true; } } if (!callback.Invoke(traverseInfo)) { return(false); } if (traverseInfo.skipCurrentTree) { if (prefabInstanceRoot) { traverseInfo.dirtyComponents = null; traverseInfo.inPrefabInstance = false; traverseInfo.inMissingPrefabInstance = false; traverseInfo.skipCurrentTree = false; } return(true); } var transform = traverseInfo.current.transform; var childrenCount = transform.childCount; for (var i = 0; i < childrenCount; i++) { var child = transform.GetChild(i); traverseInfo.current = child.gameObject; if (!TraverseGameObjectTree(traverseInfo, callback)) { return(false); } } if (prefabInstanceRoot) { traverseInfo.dirtyComponents = null; traverseInfo.inPrefabInstance = false; traverseInfo.inMissingPrefabInstance = false; traverseInfo.skipCurrentTree = false; } return(true); }
public static bool TraversePrefabGameObjects(GameObject prefabAsset, bool enablePrefabChecks, GameObjectTraverseCallback callback) { var objectTraverseInfo = new ObjectTraverseInfo(enablePrefabChecks, 1) { current = prefabAsset, inPrefabInstance = false, dirtyComponents = null, rootIndex = 0, }; return(TraverseGameObjectTree(objectTraverseInfo, callback)); }
public static bool TraverseSceneGameObjects(Scene scene, bool skipCleanPrefabInstances, bool forceAllPrefabsTraverse, GameObjectTraverseCallback callback, SceneRootTraverseCallback rootTraverseCallback = null) { var rootObjects = scene.GetRootGameObjects(); return(TraverseRootGameObjects(rootObjects, skipCleanPrefabInstances, forceAllPrefabsTraverse, callback, rootTraverseCallback)); }
public static bool TraverseRootGameObjects(GameObject[] rootObjects, bool skipCleanPrefabInstances, bool forceAllPrefabsTraverse, GameObjectTraverseCallback callback, SceneRootTraverseCallback rootTraverseCallback = null) { var rootObjectsCount = rootObjects.Length; var objectTraverseInfo = new ObjectTraverseInfo(skipCleanPrefabInstances, forceAllPrefabsTraverse, rootObjectsCount); for (var i = 0; i < rootObjectsCount; i++) { var rootObject = rootObjects[i]; if (rootTraverseCallback != null) { bool canceled; rootTraverseCallback.Invoke(i, rootObjectsCount, out canceled); if (canceled) { return(false); } } objectTraverseInfo.current = rootObject; objectTraverseInfo.rootIndex = i; if (!TraverseGameObjectTree(objectTraverseInfo, callback)) { return(false); } } return(true); }
public static bool TraversePrefabGameObjects(GameObject prefabAsset, bool skipCleanPrefabInstances, bool forceAllPrefabsTraverse, GameObjectTraverseCallback callback) { return(TraverseRootGameObjects(new [] { prefabAsset }, skipCleanPrefabInstances, forceAllPrefabsTraverse, callback)); }