rabidus-test/Assets/PolyFew/Scripts/Editor/PolyfewMenu.cs

237 lines
7.8 KiB
C#

#if UNITY_EDITOR
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
namespace BrainFailProductions.PolyFew
{
public class PolyfewMenu : MonoBehaviour
{
#if UNITY_2019_1_OR_NEWER
[MenuItem("Window/Brainfail Products/PolyFew/Cleanup Missing Scripts")]
static void CleanupMissingScripts()
{
int sceneCount = UnityEngine.SceneManagement.SceneManager.sceneCount;
for (int a = 0; a < UnityEngine.SceneManagement.SceneManager.sceneCount; a++)
{
var scene = UnityEngine.SceneManagement.SceneManager.GetSceneAt(a);
var rootGameObjects = scene.GetRootGameObjects();
if (rootGameObjects != null && rootGameObjects.Length > 0)
{
List<GameObject> allObjectsinScene = new List<GameObject>();
EditorUtility.DisplayProgressBar("Preprocessing", $"Fetching GameObjects in active scene \"{scene.name}\"", 0);
foreach (var gameObject in rootGameObjects)
{
var childObjects = gameObject.GetComponentsInChildren<Transform>();
if (childObjects != null && childObjects.Length > 0)
{
foreach (var obj in childObjects)
{
if (obj != null) { allObjectsinScene.Add(obj.gameObject); }
}
}
}
EditorUtility.ClearProgressBar();
for (int b = 0; b < allObjectsinScene.Count; b++)
{
var gameObject = allObjectsinScene[b];
EditorUtility.DisplayProgressBar("Removing missing script references", $"Inspecting GameObject {b + 1}/{allObjectsinScene.Count} in active scene \"{scene.name}\"", (float)(b) / allObjectsinScene.Count);
GameObjectUtility.RemoveMonoBehavioursWithMissingScript(gameObject);
}
EditorSceneManager.MarkSceneDirty(scene);
EditorUtility.ClearProgressBar();
}
EditorUtility.ClearProgressBar();
}
EditorUtility.ClearProgressBar();
EditorUtility.DisplayDialog("Operation Completed", "Successfully removed missing script references. Please save all currently open scenes to keep these changes persistent", "Ok");
}
public static void CleanMissingScripts()
{
CleanupMissingScripts();
}
#endif
[MenuItem("Window/Brainfail Products/PolyFew/Remove All Hidden Scripts")]
static void RemoveAllPolyFewScripts()
{
int sceneCount = UnityEngine.SceneManagement.SceneManager.sceneCount;
for (int a = 0; a < UnityEngine.SceneManagement.SceneManager.sceneCount; a++)
{
var scene = UnityEngine.SceneManagement.SceneManager.GetSceneAt(a);
var rootGameObjects = scene.GetRootGameObjects();
if (rootGameObjects != null && rootGameObjects.Length > 0)
{
List<GameObject> allObjectsinScene = new List<GameObject>();
EditorUtility.DisplayProgressBar("Preprocessing", $"Fetching GameObjects in active scene \"{scene.name}\"", 0);
foreach (var gameObject in rootGameObjects)
{
var childObjects = gameObject.GetComponentsInChildren<Transform>();
if (childObjects != null && childObjects.Length > 0)
{
foreach (var obj in childObjects)
{
if (obj != null) { allObjectsinScene.Add(obj.gameObject); }
}
}
}
EditorUtility.ClearProgressBar();
for (int b = 0; b < allObjectsinScene.Count; b++)
{
var polyfewComponent = allObjectsinScene[b].GetComponent<PolyFew>();
var objectMatLinks = allObjectsinScene[b].GetComponent<ObjectMaterialLinks>();
EditorUtility.DisplayProgressBar("Removing hidden polyfew components", $"Inspecting GameObject {b + 1}/{allObjectsinScene.Count} in active scene \"{scene.name}\"", (float)(b) / allObjectsinScene.Count);
if(polyfewComponent != null) { DestroyImmediate(polyfewComponent); }
if(objectMatLinks != null) { DestroyImmediate(objectMatLinks); }
}
EditorSceneManager.MarkSceneDirty(scene);
EditorUtility.ClearProgressBar();
}
EditorUtility.ClearProgressBar();
}
EditorUtility.ClearProgressBar();
EditorUtility.DisplayDialog("Operation Completed", "Successfully removed lod backup components. Please save all currently open scenes to keep these changes persistent", "Ok");
}
#if UNITY_2019_1_OR_NEWER
[MenuItem("Assets/Brainfail Products/PolyFew/Clean Missing Scripts From Prefabs")]
public static void CleanMissingScriptsFromFolders()
{
string folderPath = null;
string[] assetPaths = null;
if (Selection.activeObject != null)
{
folderPath = AssetDatabase.GetAssetPath(Selection.activeObject.GetInstanceID());
}
if(!string.IsNullOrWhiteSpace(folderPath))
{
assetPaths = AssetDatabase.FindAssets("t:GameObject", new string[] { folderPath });
}
else
{
assetPaths = AssetDatabase.FindAssets("t:GameObject");
}
EditorUtility.DisplayProgressBar("Removing missing components", "Please wait...", 0);
foreach(var guid in assetPaths)
{
var path = AssetDatabase.GUIDToAssetPath(guid);
var obj = AssetDatabase.LoadAssetAtPath<GameObject>(path);
var type = PrefabUtility.GetPrefabAssetType(obj);
if (type == PrefabAssetType.Model || type == PrefabAssetType.NotAPrefab || type == PrefabAssetType.Variant)
{
continue;
}
GameObject prefabRoot = PrefabUtility.LoadPrefabContents(path);
if (prefabRoot != null)
{
Transform transform = prefabRoot.transform;
var children = transform.GetComponentsInChildren<Transform>();
foreach (Transform child in children)
{
var hosts = child.GetComponent<PolyFew>();
if (hosts != null) { DestroyImmediate(hosts); }
GameObjectUtility.RemoveMonoBehavioursWithMissingScript(child.gameObject);
}
string fileName = Path.GetFileNameWithoutExtension(path);
string tempPath = path.Replace(fileName, GUID.Generate().ToString());
PrefabUtility.SaveAsPrefabAsset(prefabRoot, tempPath);
PrefabUtility.UnloadPrefabContents(prefabRoot);
UtilityServices.OverwriteAssetWith(tempPath, path, false);
bool success1 = FileUtil.DeleteFileOrDirectory(tempPath);
bool success2 = FileUtil.DeleteFileOrDirectory(Path.GetDirectoryName(tempPath) + Path.DirectorySeparatorChar + Path.GetFileName(tempPath) + ".meta");
}
}
AssetDatabase.Refresh();
EditorUtility.ClearProgressBar();
}
#endif
public static void RemovePolyFewScripts()
{
RemoveAllPolyFewScripts();
}
}
}
#endif