public static void ValidateScenesFromScript() { var sceneNames = UnityEditorUtil.GetArgument("scenes").Split(','); Assert.That(sceneNames.Length > 0); ValidateScenes( sceneNames.Select(x => UnityEditorUtil.GetScenePath(x)).ToList(), true); }
static List <ZenjectResolveException> ValidateDecoratorCompRoot(SceneDecoratorCompositionRoot decoratorCompRoot, int maxErrors) { var sceneName = decoratorCompRoot.SceneName; var scenePath = UnityEditorUtil.GetScenePath(sceneName); if (scenePath == null) { return(new List <ZenjectResolveException>() { new ZenjectResolveException( "Could not find scene path for decorated scene '{0}'".Fmt(sceneName)), }); } var rootObjectsBefore = UnityUtil.GetRootGameObjects(); OpenSceneAdditive(scenePath); var newRootObjects = UnityUtil.GetRootGameObjects().Except(rootObjectsBefore); // Use finally to ensure we clean up the data added from OpenSceneAdditive try { var previousBeforeInstallHook = SceneCompositionRoot.BeforeInstallHooks; SceneCompositionRoot.BeforeInstallHooks = (container) => { if (previousBeforeInstallHook != null) { previousBeforeInstallHook(container); } decoratorCompRoot.AddPreBindings(container); }; var previousAfterInstallHook = SceneCompositionRoot.AfterInstallHooks; SceneCompositionRoot.AfterInstallHooks = (container) => { decoratorCompRoot.AddPostBindings(container); if (previousAfterInstallHook != null) { previousAfterInstallHook(container); } }; var compRoot = newRootObjects.SelectMany(x => x.GetComponentsInChildren <SceneCompositionRoot>()).OnlyOrDefault(); if (compRoot != null) { return(ValidateCompRoot(compRoot, maxErrors)); } var newDecoratorCompRoot = newRootObjects.SelectMany(x => x.GetComponentsInChildren <SceneDecoratorCompositionRoot>()).OnlyOrDefault(); if (newDecoratorCompRoot != null) { return(ValidateDecoratorCompRoot(newDecoratorCompRoot, maxErrors)); } return(new List <ZenjectResolveException>() { new ZenjectResolveException( "Could not find composition root for decorated scene '{0}'".Fmt(sceneName)), }); } finally { #if UNITY_5_3_OR_NEWER EditorSceneManager.CloseScene(EditorSceneManager.GetSceneByPath(scenePath), true); #else foreach (var newObject in newRootObjects) { GameObject.DestroyImmediate(newObject); } #endif } }