Skip to content

Instantly share code, notes, and snippets.

@benblo
Created April 15, 2014 13:29
Show Gist options
  • Save benblo/10732800 to your computer and use it in GitHub Desktop.
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
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