#if UNITY_EDITOR using UnityEngine; using UnityEditor; using System.Collections.Generic; namespace GSpawn { public static class UndoEx { private static bool _isEnabled = true; private static Stack _enabledStateStack = new Stack(); public static bool enabled { get { return _isEnabled; } set { _isEnabled = value; } } public static void saveEnabledState() { _enabledStateStack.Push(enabled); } public static void restoreEnabledState() { if (_enabledStateStack.Count != 0) _isEnabled = _enabledStateStack.Pop(); } public static void record(Object recordObject) { if (!enabled) return; Undo.RecordObject(recordObject, GSpawn.pluginName); } public static void record(Object recordObject, string name) { if (!enabled) return; Undo.RecordObject(recordObject, name); } public static T addComponent(GameObject gameObject) where T : Component { if (enabled) return Undo.AddComponent(gameObject); else return gameObject.AddComponent(); } public static T createScriptableObject() where T : ScriptableObject { if (enabled) { var scriptableObject = ScriptableObject.CreateInstance(); Undo.RegisterCreatedObjectUndo(scriptableObject, GSpawn.pluginName); return scriptableObject; } else return ScriptableObject.CreateInstance(); } public static T cloneScriptableObject(T source) where T : ScriptableObject { if (enabled) { var clone = ScriptableObject.Instantiate(source); Undo.RegisterCreatedObjectUndo(clone, GSpawn.pluginName); return clone; } else return ScriptableObject.Instantiate(source); } public static void recordGameObject(GameObject gameObject) { if (!enabled) return; record(gameObject); } public static void recordGameObjects(IEnumerable gameObjects) { if (!enabled) return; foreach (var gameObject in gameObjects) record(gameObject); } public static void setTransformParent(Transform transform, Transform newParentTransform) { if (enabled) Undo.SetTransformParent(transform, newParentTransform, GSpawn.pluginName); else transform.parent = newParentTransform; } public static void setObjectsTransformParent(IEnumerable gameObjects, Transform newParentTransform) { if (enabled) { foreach (var gameObject in gameObjects) Undo.SetTransformParent(gameObject.transform, newParentTransform, GSpawn.pluginName); } else { foreach (var gameObject in gameObjects) gameObject.transform.parent = newParentTransform; } } public static void registerCompleteObjectUndo(UnityEngine.Object obj) { if (!enabled) return; Undo.RegisterCompleteObjectUndo(obj, GSpawn.pluginName); } public static void registerChildrenOrderUndo(UnityEngine.Object obj) { if (!enabled) return; Undo.RegisterChildrenOrderUndo(obj, GSpawn.pluginName); } public static void recordGameObjectTransforms(IEnumerable gameObjects) { if (!enabled) return; foreach (var gameObject in gameObjects) record(gameObject.transform); } public static void recordTransform(Transform transform) { if (!enabled) return; record(transform); } public static void recordTransforms(IEnumerable transforms) { if (!enabled) return; foreach (var transform in transforms) record(transform); } public static void registerCreatedObject(T createdObject) where T : UnityEngine.Object { if (!enabled) return; Undo.RegisterCreatedObjectUndo(createdObject, GSpawn.pluginName); } public static void registerCreatedObject(T createdObject, string name) where T : UnityEngine.Object { if (!enabled) return; Undo.RegisterCreatedObjectUndo(createdObject, name); } public static void destroyObjectImmediate(Object unityObject) { if (enabled) Undo.DestroyObjectImmediate(unityObject); else Object.DestroyImmediate(unityObject, true); } public static void destroyGameObjectsImmediate(List gameObjects) { if (enabled) { foreach (var gameObj in gameObjects) { if (gameObj != null) Undo.DestroyObjectImmediate(gameObj); } } else { foreach (var gameObj in gameObjects) { if (gameObj != null) GameObject.DestroyImmediate(gameObj); } } } public static void destroyGameObjectImmediate(GameObject gameObject) { if (enabled) Undo.DestroyObjectImmediate(gameObject); else GameObject.DestroyImmediate(gameObject); } } } #endif