Created
February 17, 2022 06:11
-
-
Save marinho/b5e7dd912f0ef695d82ca57483ee6cdd to your computer and use it in GitHub Desktop.
Class to add all scenes in a Unity project into build settings. This is simpler than adding them manually one by one using UI.
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
#if UNITY_EDITOR | |
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Reflection; | |
using System.Text; | |
using System.ComponentModel; | |
using System.Diagnostics; | |
using System.Text.RegularExpressions; | |
using UnityEngine; | |
using UnityEditor; | |
namespace Twelve | |
{ | |
public class UniyGameScenesInBulk : EditorWindow | |
{ | |
[MenuItem("Tools/Twelve/Add Game Scenes", false, 0)] | |
public static void AddTwelveScenes() | |
{ | |
List<EditorBuildSettingsScene> editorBuildSettingsScenes = new List<EditorBuildSettingsScene>(EditorBuildSettings.scenes); | |
var sceneFiles = GetScenesInFolder("Game"); | |
foreach (var sceneFile in sceneFiles) { | |
AddOrEnableSceneToSettings(editorBuildSettingsScenes, sceneFile); | |
} | |
EditorBuildSettings.scenes = editorBuildSettingsScenes.ToArray(); | |
} | |
static void AddOrEnableSceneToSettings(List<EditorBuildSettingsScene> scenes, string path) { | |
var existing = scenes.Find(s => s.path == path); | |
if (existing == null) { | |
EditorBuildSettingsScene sceneToAdd = new EditorBuildSettingsScene(path, true); | |
scenes.Add(sceneToAdd); | |
UnityEngine.Debug.Log($"Scene '{path}' was added."); | |
} | |
else if (!existing.enabled) { | |
existing.enabled = true; | |
UnityEngine.Debug.Log($"Scene '{path}' was enabled."); | |
} | |
} | |
static List<string> GetScenesInFolder(string scenesFolder) { | |
string assetsFolder = Application.dataPath; | |
string fullPath = $"{assetsFolder}/{scenesFolder}"; | |
string findCmd = $"find {fullPath} -name '*.unity'"; | |
var outputLines = new List<string>(ExecuteProcessTerminal(findCmd).Split('\n')); | |
var sceneFiles = outputLines.Select(s => s.Replace($"{assetsFolder}", "Assets")).ToList(); | |
var notEmptySceneFiles = sceneFiles.FindAll(f => f.Trim() != ""); | |
return notEmptySceneFiles; | |
} | |
static string ExecuteProcessTerminal(string argument) | |
{ | |
try | |
{ | |
// UnityEngine.Debug.Log("============== Start Executing [" + argument + "] ==============="); | |
ProcessStartInfo startInfo = new ProcessStartInfo() | |
{ | |
FileName = "/bin/bash", | |
UseShellExecute = false, | |
RedirectStandardError = true, | |
RedirectStandardInput = true, | |
RedirectStandardOutput = true, | |
CreateNoWindow = true, | |
Arguments = " -c \"" + argument + " \"" | |
}; | |
Process myProcess = new Process | |
{ | |
StartInfo = startInfo | |
}; | |
myProcess.Start(); | |
string output = myProcess.StandardOutput.ReadToEnd(); | |
// UnityEngine.Debug.Log(output); // GetStringResult | |
myProcess.WaitForExit(); | |
// UnityEngine.Debug.Log("============== End ==============="); | |
return output; | |
} | |
catch (Exception e) | |
{ | |
UnityEngine.Debug.Log(e); | |
return ""; | |
} | |
} | |
} | |
} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment