using System.Collections.Generic; using UnityEngine; namespace qtools.qhierarchy { [ExecuteInEditMode] [AddComponentMenu("")] public class QObjectList : MonoBehaviour, ISerializationCallbackReceiver { public static List instances = new List(); public List lockedObjects = new List(); public List editModeVisibileObjects = new List(); public List editModeInvisibleObjects = new List(); public List wireframeHiddenObjects = new List(); public Dictionary gameObjectColor = new Dictionary(); public List gameObjectColorKeys = new List(); public List gameObjectColorValues = new List(); public void Awake() { checkIntegrity(); foreach (GameObject editModeVisibileObject in editModeVisibileObjects) { editModeVisibileObject.SetActive(!Application.isPlaying); } foreach (GameObject editModeInvisibleObject in editModeInvisibleObjects) { editModeInvisibleObject.SetActive(Application.isPlaying); } if (!Application.isEditor && Application.isPlaying) { instances.Remove(this); Object.DestroyImmediate(base.gameObject); return; } instances.RemoveAll((QObjectList item) => item == null); if (!instances.Contains(this)) { instances.Add(this); } } public void OnEnable() { if (!instances.Contains(this)) { instances.Add(this); } } public void OnDestroy() { if (Application.isPlaying) { return; } checkIntegrity(); foreach (GameObject editModeVisibileObject in editModeVisibileObjects) { editModeVisibileObject.SetActive(false); } foreach (GameObject editModeInvisibleObject in editModeInvisibleObjects) { editModeInvisibleObject.SetActive(true); } foreach (GameObject lockedObject in lockedObjects) { lockedObject.hideFlags &= ~HideFlags.NotEditable; } instances.Remove(this); } public void merge(QObjectList anotherInstance) { for (int num = anotherInstance.lockedObjects.Count - 1; num >= 0; num--) { if (!lockedObjects.Contains(anotherInstance.lockedObjects[num])) { lockedObjects.Add(anotherInstance.lockedObjects[num]); } } for (int num2 = anotherInstance.editModeVisibileObjects.Count - 1; num2 >= 0; num2--) { if (!editModeVisibileObjects.Contains(anotherInstance.editModeVisibileObjects[num2])) { editModeVisibileObjects.Add(anotherInstance.editModeVisibileObjects[num2]); } } for (int num3 = anotherInstance.editModeInvisibleObjects.Count - 1; num3 >= 0; num3--) { if (!editModeInvisibleObjects.Contains(anotherInstance.editModeInvisibleObjects[num3])) { editModeInvisibleObjects.Add(anotherInstance.editModeInvisibleObjects[num3]); } } for (int num4 = anotherInstance.wireframeHiddenObjects.Count - 1; num4 >= 0; num4--) { if (!wireframeHiddenObjects.Contains(anotherInstance.wireframeHiddenObjects[num4])) { wireframeHiddenObjects.Add(anotherInstance.wireframeHiddenObjects[num4]); } } for (int num5 = anotherInstance.gameObjectColorKeys.Count - 1; num5 >= 0; num5--) { if (!gameObjectColorKeys.Contains(anotherInstance.gameObjectColorKeys[num5])) { gameObjectColorKeys.Add(anotherInstance.gameObjectColorKeys[num5]); gameObjectColorValues.Add(anotherInstance.gameObjectColorValues[num5]); gameObjectColor.Add(anotherInstance.gameObjectColorKeys[num5], anotherInstance.gameObjectColorValues[num5]); } } } public void checkIntegrity() { lockedObjects.RemoveAll((GameObject item) => item == null); editModeVisibileObjects.RemoveAll((GameObject item) => item == null); editModeInvisibleObjects.RemoveAll((GameObject item) => item == null); wireframeHiddenObjects.RemoveAll((GameObject item) => item == null); for (int num = gameObjectColorKeys.Count - 1; num >= 0; num--) { if (gameObjectColorKeys[num] == null) { gameObjectColorKeys.RemoveAt(num); gameObjectColorValues.RemoveAt(num); } } OnAfterDeserialize(); } public void OnBeforeSerialize() { gameObjectColorKeys.Clear(); gameObjectColorValues.Clear(); foreach (KeyValuePair item in gameObjectColor) { gameObjectColorKeys.Add(item.Key); gameObjectColorValues.Add(item.Value); } } public void OnAfterDeserialize() { gameObjectColor.Clear(); for (int i = 0; i < gameObjectColorKeys.Count; i++) { gameObjectColor.Add(gameObjectColorKeys[i], gameObjectColorValues[i]); } } } }