Created
April 15, 2014 13:29
-
-
Save benblo/10732800 to your computer and use it in GitHub Desktop.
Utility to open all scenes of a Unity project and process them: resave, refactor data, etc. To be used with EditorCoroutines: https://gist.github.com/benblo/10732554
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections; | |
using System.Collections.Generic; | |
using System.IO; | |
using UnityEngine; | |
using Object = UnityEngine.Object; | |
using UnityEditor; | |
namespace Swing.Editor | |
{ | |
public static class SceneUtility | |
{ | |
public static string[] findAllScenePaths() | |
{ | |
var guids = AssetDatabase.FindAssets("t:Scene"); | |
var paths = Array.ConvertAll<string, string>(guids, AssetDatabase.GUIDToAssetPath); | |
paths = Array.FindAll(paths, File.Exists); // Unity erroneously considers folders named something.unity as scenes, remove them | |
return paths; | |
} | |
public delegate void ProcessAllScenesDelegate( string _scenePath, Object _sceneObject ); | |
public static void processAllScenes( | |
ProcessAllScenesDelegate _callback ) | |
{ | |
processAllScenes( | |
"Processing {0} Scenes", | |
"Processing scene {1}/{0} : {2}", | |
_callback); | |
} | |
/// <summary> | |
/// Format {0} : scene count | |
/// Format {1} : scene index | |
/// Format {2} : scene path | |
/// </summary> | |
public static void processAllScenes( | |
string _titleFormat, | |
string _messageFormat, | |
ProcessAllScenesDelegate _callback ) | |
{ | |
if (!EditorApplication.SaveCurrentSceneIfUserWantsTo()) | |
{ | |
return; | |
} | |
EditorCoroutine.start( | |
processAllScenesCoroutine(_titleFormat, _messageFormat, _callback)); | |
} | |
static IEnumerator processAllScenesCoroutine( | |
string _titleFormat, | |
string _messageFormat, | |
ProcessAllScenesDelegate _callback ) | |
{ | |
var scenePaths = findAllScenePaths(); | |
var sceneCount = scenePaths.Length; | |
Debug.Log(string.Format("Processing {0} scenes", sceneCount)); | |
for (int i = 0; i < sceneCount; i++) | |
{ | |
var scenePath = scenePaths[i]; | |
EditorUtility.DisplayProgressBar( | |
string.Format(_titleFormat, sceneCount, i, scenePath), | |
string.Format(_messageFormat, sceneCount, i, scenePath), | |
(float)i / sceneCount); | |
Object sceneObject = AssetDatabase.LoadMainAssetAtPath(scenePath); | |
if (EditorApplication.OpenScene(scenePath)) | |
{ | |
// delay one frame to give a chance for all Awake/Start/OnEnable callbacks to trigger | |
yield return null; | |
try | |
{ | |
_callback(scenePath, sceneObject); | |
} | |
catch (Exception e) | |
{ | |
Debug.LogError(string.Format("Error while processing scene '{0}'", scenePath), sceneObject); | |
Debug.LogException(e); | |
} | |
} | |
else | |
{ | |
Debug.LogError(string.Format("Failed to open scene '{0}'", scenePath), sceneObject); | |
} | |
} | |
EditorUtility.ClearProgressBar(); | |
EditorApplication.NewScene(); | |
} | |
[MenuItem("Swing/Scenes/Resave All Scenes")] | |
public static void resaveAllScenes() | |
{ | |
processAllScenes( | |
"Resaving {0} Scenes", | |
"Resaving scene {1}/{0} : {2}", | |
( scenePath, sceneObject ) => | |
{ | |
if (EditorApplication.SaveScene()) | |
{ | |
Debug.Log(string.Format("Scene '{0}' saved successfully", scenePath), sceneObject); | |
} | |
else | |
{ | |
Debug.LogError(string.Format("Scene '{0}' save failed", scenePath), sceneObject); | |
} | |
}); | |
} | |
[MenuItem("Swing/Scenes/Test Open All Scenes")] | |
static void openAllScenes() | |
{ | |
processAllScenes( | |
"Opening {0} Scenes", | |
"Opening scene {1}/{0}\n{2}", | |
( scenePath, sceneObject ) => | |
{ | |
Debug.Log(string.Format("Scene '{0}' open successfully", scenePath), sceneObject); | |
}); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment